This notebook aims at exploring the Cetacean occurrence dataset from the PaleoBiology DataBase (PBDB), looking for potential biases invalidating to our model assumptions and how to mitigate them. Subsampling this dataset will allow (1) to reduce the computational burden of our analysis and (2) to compensate for the biases mentioned above.
Explore the dataset
Repartition through time
Full fossil record
First, use the stratigraphic range’s midpoint as the occurrence fixed age.


\(\to\) Numerous occurrences seem to have the same age interval so in order to avoid clusters let’s draw them uniformly in their stratigraphic range rather than taking the midpoint.


\(\to\) The repartition seems much smoother now.
Subsampling
These occurrences are too numerous for a faster preliminary analysis, let’s randomly subsample a fraction of them.


\(\to\) The distribution looks similar, with some noise due to higher variance with smaller sample.
Repartition among accepted ranks
Pie chart

\(\to\) Half of the occurrences are identified at the level of the secies and 1/3 at the genus or family.
Some clades are unranked :
Chaeomysticeti Neoceti Panphyseteroidea Pelagiceti Platanidelphidi Squaloceti
26 2 1 1 1 1
Time repartition by rank

\(\to\) Apparent huge cluster of occurrences in recent times, with very precise dating = Artefact due to the “Pull of the Recent” effect ?
\(\implies\) We decided to remove all Late Pleistocene and Holocene occurrences (thus setting the \(\omega\)-sampling to 0) in order to avoid this bias.

\(\to\) We observe similar trends at each rank, with peaks at ~15My and ~5My.
Redundancy of occurrences with the same accepted name

\(\to\) ~Half of species/genera/subfamilies have only one specimen by accepted name, but it could go up to ~50 within the same species and ~200 occurrences within the same suborder. In our model all species are upposed to have the same abundance (identical sampling rates among branches), so those huge differences will have to be mitigated. See later for a quantification of this discrepancy.
\(\implies\) Our goal now will be to correct this abundance bias.
Time intervals = stratigraphic age uncertainty (minimum and maximum ages)

Time ranges = duration of the time intervals (maximum age - minimum age)
Count occurrences by accepted name
Count the number of occurrences with the same accepted name


\(\to\) Some occurrences have too much age uncertainty (unrelated to species longevity in extreme cases like the one spanning 60My), they risk to artificially increase species durations.
Remove occurrences with highly uncertain dating (range > 10My)

Most of occurrences show less than 10 My age uncertainty, let’s keep only these ones.


\(\to\) The removal of highly uncertain occurrences seems to be only a little biased, even if uncertainty globally increases with age.


\(\to\) Some species (or other ranks) have several occurrences with several time ranges, let’s combine them into a unique range covering all the others.
Combined time ranges = unique time range for occurrences with the same name (without the biggest ones)


Occurrence density = number of occurrences by unit of time, in the stratigraphic interval of a taxon
Density distributions
Plot the density of occurrences for each taxonomic rank, and highlight the role

\(\to\) Density logically increases with taxa ranks, but the distributions for species and genera dramatically spread over two orders of magnitude.
Correlation between time range and age
If we want to correct species abundance differences based on the density of occurrences in the age interval, those factors should not depend on time in order to avoid penalizing periods with higher densities.
Let’s compare the occurrence densites computed with the initial time ranges and the combined densities computed with the combined ranges.


\(\to\) The density based on combined ranges seems less time-dependant than the density based on initial time ranges. We will therefore use the combined density for our corrections.
Subsampling occurrences by homogenizing the combined occurrence density
Subsampling by homogenization = reducing the discrepancy between high and low occurrence densities among taxa by subsampling preferencially the densest ones.
Compare densities by accepted name count (species only)
Let’s focus now on the occurrences accepted at the species level because they are the one for which we can correct the abundance bias by subsampling the most concentrated combined intervals.

\(\to\) Their is a huge span of densities driven by the number of occurrences for the same species that we can reduce by subsampling the most concentrated intervals.
Impact of correcting subsampling on density distributions (species only)

\(\to\) Subsampling by homogenization successfully reduces the density span from 2 to 1 order of magnitude.
Impact of subsampling on occurrences repartition (species only)
See what our distributions look like after subsampling :

\(\to\) Some highly dense cluster became much more similar to the others.


If we superpose these 2 plots :

\(\to\) We get the new species occurrence repartition after subsampling, that could be used for doing inference with the occurrence birth-death model.
Compare with a Poisson sampling process
In order to check if the data fit our assumptions of constant-fossilisation-rate Poisson sampling we compare the observed occurrences distributions with the expected ones. Specifically, we will look at the number of taxa represented by 1, 2, 3, … occurrences and the one that we would expect for a given distribution of combined age ranges (seen here as a proxy for species duration).


In a Poisson process with occurrence sampling rate \(\omega\) and for a given time interval of length \(t\), the probability of observing \(N_t = k\) occurrences is given by the Poisson distribution of mean of parameter \(\omega\times t\) :
\[\mathbb{P}(N_t=k) = e^{-\omega t}\frac{(\omega t)^k}{k!}\]
So in order to have the absolute probability of observing \(N_0 = n\) occurrences we have to integrate over the full distribution of age ranges \(t\), called \(f(t)\) :
\[\mathbb{P}(N_0 = n) = \int_t P(N_t = n) f(t) dt = \int_t e^{-\omega t}\frac{(\omega t)^n}{n!} f(t) dt\]
First, approximate this distribution :

Then integrate and plot the expected distribution for a given omega :

Finally, try to find an \(\omega\) value that approximately fits the first points (the least affected by oversampling biases) and check if the other points follow the expected curve :


\(\implies\) Initial observations really do not fit the expectations, species with more than 5 occurrences must remain very rare ! But our subsampling seems to correct most of this bias.
However, this method requires to make several arbitrary choices that may introduce new biases so we will instead subsample at other levels (palaeontological collection, geological formation). In each case only one occurrence will be sampled for the similarly identified, a process we will refer to as aggregating these occurrences according to the chosen factor.
Subsampling occurrences by aggregating similarly identified occurrences in each collection
Subsampling by aggregation = aggregate all the occurrences of a given taxon according to a given criterium (collection, geological formation, country, geological plate).
Aggregate similarly identified occurrences in each collection
In order to reduce the abundance bias, we may keep only one occurrence for each collection :
\(\to\) Not enough occurrences are removed to make a sufficient difference. If we look at the collection with the highest number of occurrences :
Aprixokogia kelloggi Balaena Balaenoptera acutorostrata Balaenopteridae
1 2 2 2
Balaenula Bohaskaia monodontoides Cetotheriinae Delphinapterus
2 1 1 3
Delphinidae Delphinus Globicephala Gricetoides aurorae
2 2 2 1
Herpetocetinae Herpetocetus sendaicus Herpetocetus transatlanticus Kogia breviceps
1 1 1 1
Kogiidae Kogiinae Kogiopsis floridana Lagenorhynchus
1 2 1 2
Lagenorhynchus harmatuki Megaptera Mesoplodon longirostris Monodon
1 2 2 1
Ninoziphius platyrostris Orycterocetus Physeter macrocephalus Physeteridae
3 1 1 1
Physeterinae Physeterula dubusi Plesiocetus Pliopontos littoralis
2 1 1 1
Pontoporia Pontoporiidae Pseudorca Scaldicetus
1 2 2 1
Stenella Stenella rayi Tursiops Ziphius cavirostris
2 1 2 2
\(\to\) There are very few redundancies among the accepted names in collections so aggregating those won’t reduce the abundance bias.
Instead, we may try to aggregate occurrences with the same accepted name at the level of the geological formation (ie subsample only one for each).
Check that the sampling methods do not introduce biases in the repartition between Odontoceti and Mysticeti
Mystecetes are usually larger than odontocetes, and size is associated with a wider geographic range so since we are subsampling occurrences according to geological formation we may be biasing our data towards more widespread species, therefore towards mystecetes.
Look at the families first :

\(\to\) The family repartitions vary a bit after subsampling, but because of the limited number of species by family the fact that we corrected the oversampling of some species could have a disproportionate effect.
Let’s look rather at a higher taxonomic rank, by importing the topology of cetacean families (from Marx et al. 2016) :


\(\to\) There is a smaller proportion of archeocete occurrences after either sampling, because a huge cluster is subsampled around 35 My ago, but this effect is expected. However, for the Mysticeti vs. Odotoceti there is no huge apparent bias, especially with the aggregating method.

Faster genus-level analysis
Apply the same transformations at the generic level to perform the analysis faster.
More occurrences remain after aggregating with this new method. Let’s compare again with the theoretical distribution :


\(\to\) The correspondance is much less improved than with species aggregation because some genera have a lot of occurrences due to their high number of species species :
Balaenoptera Kentriodon Mesoplodon Scaldicetus Squalodon
53 27 30 41 40
Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Delimiting by geological plates (+ age) instead of countries (+ age) leads to similar distributions, with a bit more occurrences.
LS0tCnRpdGxlOiAiRm9ybWF0IENldGFjZWFucyBEYXRhIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiAKICAgIGZpZ19oZWlnaHQ6IDUuNQogICAgZmlnX3dpZHRoOiAxMAogICAgdG9jOiB5ZXMKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ193aWR0aDogMTAKICAgIHRvYzogeWVzCi0tLQoKQ3JlYXRpb24gLSBqZXJlbXkuYW5kcmVvbGV0dGlAZW5zLmZyIC0gMTMvMDQvMjAyMAoKVGhpcyBub3RlYm9vayBhaW1zIGF0IGV4cGxvcmluZyB0aGUgQ2V0YWNlYW4gb2NjdXJyZW5jZSBkYXRhc2V0IGZyb20gdGhlIFBhbGVvQmlvbG9neSBEYXRhQmFzZSAoUEJEQiksIGxvb2tpbmcgZm9yIHBvdGVudGlhbCBiaWFzZXMgaW52YWxpZGF0aW5nIHRvIG91ciBtb2RlbCBhc3N1bXB0aW9ucyBhbmQgaG93IHRvIG1pdGlnYXRlIHRoZW0uIFN1YnNhbXBsaW5nIHRoaXMgZGF0YXNldCB3aWxsIGFsbG93ICgxKSB0byByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uYWwgYnVyZGVuIG9mIG91ciBhbmFseXNpcyBhbmQgKDIpIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBiaWFzZXMgbWVudGlvbmVkIGFib3ZlLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgiZ2d0cmVlIikKYGBgCgojIExvYWQgb2NjdXJyZW5jZSBkYXRhc2V0CgpgYGB7ciwgaW5jbHVkZT1GfQojIGNldGFjZWFfcGJkYiA8LSByZWFkLmNzdigiLi4vZGF0YS1jZXRhY2VhbnMvY2V0YWNlYV9wYmRiXzA1X0Fwcl8yMDE4LmNzdiIsIHNraXAgPSAxNikKY2V0YWNlYV9wYmRiIDwtIHJlYWQuY3N2MigiLi4vZGF0YS1jZXRhY2VhbnMvY2V0YWNlYV9wYmRiXzExX01heV8yMDIwLmNzdiIsIHNraXAgPSAxNykKIyBSZW1vdmUgY29sdW1ucyB3aXRoIG9ubHkgTkFzCmNldGFjZWFfcGJkYiA8LSBjZXRhY2VhX3BiZGJbLGNvbFN1bXMoaXMubmEoY2V0YWNlYV9wYmRiKSkgPCBucm93KGNldGFjZWFfcGJkYildCiMgUmVjb3JkIGNsYXNzeWluZyBudW1iZXJzIGFzIGZhY3RvcnMKY2V0YWNlYV9wYmRiWywgZ3JlcCgiX25vIiwgbmFtZXMoY2V0YWNlYV9wYmRiKSwgdmFsdWUgPSBUKV0gPC0gZGF0YS5mcmFtZShzYXBwbHkoY2V0YWNlYV9wYmRiWywgZ3JlcCgiX25vIiwgbmFtZXMoY2V0YWNlYV9wYmRiKSwgdmFsdWUgPSBUKV0sIGFzLmZhY3RvcikpCiMgUmVjb3JkIG51bWVyaWMgcXVhbnRpdGllcyBhcyBkb3VibGVzCmNldGFjZWFfcGJkYlssIGMoImxhdCIsICJsbmciLCAicGFsZW9sYXQiLCAicGFsZW9sbmciLCAibWluX21hIiwgIm1heF9tYSIpXSA8LSBzYXBwbHkoY2V0YWNlYV9wYmRiWywgYygibGF0IiwgImxuZyIsICJwYWxlb2xhdCIsICJwYWxlb2xuZyIsICJtaW5fbWEiLCAibWF4X21hIildLCBmdW5jdGlvbihjb2wpe2FzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGNvbCkpfSkKIyBzdW1tYXJ5KGNldGFjZWFfcGJkYltncmVwKCJjb21tZW50IiwgbmFtZXMoY2V0YWNlYV9wYmRiKSwgdmFsdWUgPSBULCBpbnZlcnQ9VCldKQpuYW1lcyhjZXRhY2VhX3BiZGIpCmBgYAoKYGBge3IsIGluY2x1ZGU9Rn0KaGVhZChjZXRhY2VhX3BiZGIpCmBgYAoKYGBge3IsIGluY2x1ZGU9Rn0KIyBSZW9yZGVyIGFjY2VwdGVkIHJhbmtzIGFjY29yZGluZyB0byBjbGFzc2lmaWNhdGlvbiBzdGFuZGFyZC4KCmxldmVscyhjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuaykKY2V0YWNlYV9wYmRiJGFjY2VwdGVkX3JhbmsgPC0gZmFjdG9yKGNldGFjZWFfcGJkYiRhY2NlcHRlZF9yYW5rLCBsZXZlbHM9Yygic3Vic3BlY2llcyIsICJzcGVjaWVzIiwgImdlbnVzIiwgInN1YmZhbWlseSIsICJmYW1pbHkiLCAic3VwZXJmYW1pbHkiLCAiaW5mcmFvcmRlciIsICJzdWJvcmRlciIsICJvcmRlciIsICJ1bnJhbmtlZCBjbGFkZSIpKQpjZXRhY2VhX3BiZGIkaWRlbnRpZmllZF9yYW5rIDwtIGZhY3RvcihjZXRhY2VhX3BiZGIkaWRlbnRpZmllZF9yYW5rLCBsZXZlbHM9Yygic3Vic3BlY2llcyIsICJzcGVjaWVzIiwgImdlbnVzIiwgInN1YmZhbWlseSIsICJmYW1pbHkiLCAic3VwZXJmYW1pbHkiLCAiaW5mcmFvcmRlciIsICJzdWJvcmRlciIsICJvcmRlciIsICJ1bnJhbmtlZCBjbGFkZSIpKQpgYGAKCiMgTG9hZCB0aGUgbGlzdCBvZiBvY2N1cnJlbmNlcyB3aXRoIG1vcnBob2xvZ2ljYWwgaW5mb3JtYXRpb24KClRoZXNlIGFyZSB0aGUgc3BlY2ltZW5zIHRoYXQgYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHRyZWUgdGhhbmtzIHRvIHRoZWlyIG1vcnBob2xvZ2ljYWwgY2hhcmFjdGVycywgYW5kIG11c3QgdGhlcmVmb3JlIGJlIHJlbW92ZWQgZnJvbSB0aGUgb2NjdXJyZW5jZSBkYXRhc2V0LgoKYGBge3IsIGluY2x1ZGU9Rn0Kb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5IDwtIHJlYWQuY3N2MigiLi4vZGF0YS1jZXRhY2VhbnMvU3BlY2ltZW5zUEJEQl9uZXdOYW1lcy5jc3YiKQpzdW1tYXJ5KG9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neSkKYGBgCgpDb21iaW5lIHRoZXNlIHRheGEgd2l0aCBleHRhbnQgdGF4YSB0byBnZXQgYWxsIHRoZSBzcGVjaWVzIGluY2x1ZGVkIGluIHRoZSB0cmVlLgoKYGBge3IsIGluY2x1ZGU9Rn0KZXh0YW50X3RheGEgPC0gcmVhZC5jc3YyKCIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2V4dGFudF90YXhhLmNzdiIpCnN1bW1hcnkoZXh0YW50X3RheGEpCmBgYAoKYGBge3IsIGluY2x1ZGU9Rn0KZXh0aW5jdF90YXhhIDwtIGNldGFjZWFfcGJkYltjZXRhY2VhX3BiZGIkb2NjdXJyZW5jZV9ubyAlaW4lIG9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neSRwYmRiX29jY3VyZW5jZS5udW1iZXIsIGMoImFjY2VwdGVkX25hbWUiLCAibWluX21hIiwgIm1heF9tYSIpXQpleHRpbmN0X3RheGEkYWNjZXB0ZWRfbmFtZSA8LSBhcy5mYWN0b3IoZ3N1YigiICIsICJfIiwgZXh0aW5jdF90YXhhJGFjY2VwdGVkX25hbWUpKQpuYW1lcyhleHRpbmN0X3RheGEpIDwtIG5hbWVzKGV4dGFudF90YXhhKQpzdW1tYXJ5KGV4dGluY3RfdGF4YSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQp0YXhhIDwtIHJiaW5kKGV4dGFudF90YXhhLCBleHRpbmN0X3RheGEpCnN1bW1hcnkodGF4YSkKd3JpdGUudGFibGUodGF4YSwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX3RheGEuY3N2IiwgcXVvdGUgPSBGLCBzZXA9Ilx0Iiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQojIENoZWNrIHRoYXQgdGhlIG5hbWVzIGluIHRoZSBkYXRhc2V0cyBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBpbiB0aGUgbGlzdCBhYm92ZS4KCm1vcnBob19uYW1lcyA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9tb3JwaG9fc2ltcGxpZmllZF9uZXdOYW1lc19yZW1vdmVPdXRncm91cHNVbmRlc2NyaWJlZC5uZXgiLCBza2lwPTYsIGZpbGw9VCkKbW9ycGhvX25hbWVzIDwtIGRyb3BsZXZlbHMobW9ycGhvX25hbWVzJFYxW3NhcHBseShtb3JwaG9fbmFtZXMkVjEsIGdyZXBsLCBwYXR0ZXJuPSJfIildKQoKbWl0X25hbWVzIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL000Mzc2X210X3NpbXBsaWZpZWRfbmV3TmFtZXNfcmVtb3ZlT3V0Z3JvdXBzLm5leCIsIHNraXA9NiwgZmlsbD1UKQptaXRfbmFtZXMgPC0gZHJvcGxldmVscyhtaXRfbmFtZXMkVjFbc2FwcGx5KG1pdF9uYW1lcyRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgpudWNfbmFtZXMgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvTTQzNThfbnVjbGVhcl9zaW1wbGlmaWVkX25ld05hbWVzX3JlbW92ZU91dGdyb3Vwcy5uZXgiLCBza2lwPTYsIGZpbGw9VCkKbnVjX25hbWVzIDwtIGRyb3BsZXZlbHMobnVjX25hbWVzJFYxW3NhcHBseShudWNfbmFtZXMkVjEsIGdyZXBsLCBwYXR0ZXJuPSJfIildKQoKIyBDaGVjayB0aGF0IGFsbCB0aGUgZGF0YXNldHMgY29udGFpbiB0aGUgc2FtZSB0YXhhIG5hbWVzCnNldGVxdWFsKHRheGEkdGF4b24sIHVuaW9uKHVuaW9uKG1vcnBob19uYW1lcywgbWl0X25hbWVzKSwgbnVjX25hbWVzKSkKYGBgCgpJZGVtIGF0IHRoZSBnZW5lcmljIGxldmVsIGZvciB0aGUgZ2VudXMgYW5hbHlzaXMuCgpgYGB7ciwgaW5jbHVkZT1GfQpvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3lfZ2VuZXJhIDwtIG9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neVstd2hpY2gob2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5JFRheG9uICVpbiUgYygiQXRvY2V0dXNfbmFzYWxpcyIsICJCcmFjaHlkZWxwaGlzX2phaHVheWVuc2lzIiwgIkhhYm9yb3Bob2NvZW5hX21pbnV0dXMiLCAiTG9waG9jZXR1c19yZXBlbm5pbmdpIiwgIk9kb2Jlbm9jZXRvcHNfcGVydXZpYW51cyIsICJPdGVrYWlrZWFfaHVhdGEiLCAiUGFyYXBvbnRvcG9yaWFfd2lsc29uaSIpKSxdCmV4dGFudF9nZW5lcmEgPC0gcmVhZC5jc3YyKCIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2V4dGFudF9nZW5lcmEuY3N2IikKc3VtbWFyeShleHRhbnRfZ2VuZXJhKQoKZXh0aW5jdF9nZW5lcmEgPC0gY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRvY2N1cnJlbmNlX25vICVpbiUgb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5X2dlbmVyYSRwYmRiX29jY3VyZW5jZS5udW1iZXIsIGMoImFjY2VwdGVkX25hbWUiLCAibWluX21hIiwgIm1heF9tYSIpXQpleHRpbmN0X2dlbmVyYSRhY2NlcHRlZF9uYW1lIDwtIGFzLmZhY3Rvcihnc3ViKCIgIiwgIl8iLCBleHRpbmN0X2dlbmVyYSRhY2NlcHRlZF9uYW1lKSkKbmFtZXMoZXh0aW5jdF9nZW5lcmEpIDwtIG5hbWVzKGV4dGFudF9nZW5lcmEpCnN1bW1hcnkoZXh0aW5jdF9nZW5lcmEpCgpnZW5lcmEgPC0gcmJpbmQoZXh0YW50X2dlbmVyYSwgZXh0aW5jdF9nZW5lcmEpCnN1bW1hcnkoZ2VuZXJhKQp3cml0ZS50YWJsZShnZW5lcmEsIGZpbGUgPSAiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9nZW5lcmEuY3N2IiwgcXVvdGUgPSBGLCBzZXA9Ilx0Iiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GfQojIENoZWNrIHRoYXQgdGhlIG5hbWVzIGluIHRoZSBkYXRhc2V0cyBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBpbiB0aGUgbGlzdCBhYm92ZS4KCm1vcnBob19uYW1lc19nZW5lcmEgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvbW9ycGhvX3NpbXBsaWZpZWRfbmV3TmFtZXNfZ2VuZXJhX3JlbW92ZU91dGdyb3Vwc1VuZGVzY3JpYmVkLm5leCIsIHNraXA9NiwgZmlsbD1UKQptb3JwaG9fbmFtZXNfZ2VuZXJhIDwtIGRyb3BsZXZlbHMobW9ycGhvX25hbWVzX2dlbmVyYSRWMVtzYXBwbHkobW9ycGhvX25hbWVzX2dlbmVyYSRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgptaXRfbmFtZXNfZ2VuZXJhIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL000Mzc2X210X3NpbXBsaWZpZWRfbmV3TmFtZXNfZ2VuZXJhX3JlbW92ZU91dGdyb3Vwcy5uZXgiLCBza2lwPTYsIGZpbGw9VCkKbWl0X25hbWVzX2dlbmVyYSA8LSBkcm9wbGV2ZWxzKG1pdF9uYW1lc19nZW5lcmEkVjFbc2FwcGx5KG1pdF9uYW1lc19nZW5lcmEkVjEsIGdyZXBsLCBwYXR0ZXJuPSJfIildKQoKbnVjX25hbWVzX2dlbmVyYSA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9NNDM1OF9udWNsZWFyX3NpbXBsaWZpZWRfbmV3TmFtZXNfZ2VuZXJhX3JlbW92ZU91dGdyb3Vwcy5uZXgiLCBza2lwPTYsIGZpbGw9VCkKbnVjX25hbWVzX2dlbmVyYSA8LSBkcm9wbGV2ZWxzKG51Y19uYW1lc19nZW5lcmEkVjFbc2FwcGx5KG51Y19uYW1lc19nZW5lcmEkVjEsIGdyZXBsLCBwYXR0ZXJuPSJfIildKQoKIyBDaGVjayB0aGF0IGFsbCB0aGUgZGF0YXNldHMgY29udGFpbiB0aGUgc2FtZSB0YXhhIG5hbWVzCnNldGVxdWFsKGdlbmVyYSR0YXhvbiwgdW5pb24odW5pb24obW9ycGhvX25hbWVzX2dlbmVyYSwgbWl0X25hbWVzX2dlbmVyYSksIG51Y19uYW1lc19nZW5lcmEpKQpgYGAKClJlbW92ZSB0aG9zZSBvY2N1cnJlbmNlcyBmcm9tIG91ciBpbml0aWFsIGRhdGFzZXQgdG8gYXZvaWQgcmVkdW5kYW5jeS4KCmBgYHtyfQpjZXRhY2VhX3BiZGIgPC0gY2V0YWNlYV9wYmRiWyEoY2V0YWNlYV9wYmRiJG9jY3VycmVuY2Vfbm8gJWluJSBvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3kkcGJkYl9vY2N1cmVuY2UubnVtYmVyKSxdCmBgYAoKIyBFeHBsb3JlIHRoZSBkYXRhc2V0CiMjIFJlcGFydGl0aW9uIHRocm91Z2ggdGltZQojIyMgRnVsbCBmb3NzaWwgcmVjb3JkCgpGaXJzdCwgdXNlIHRoZSBzdHJhdGlncmFwaGljIHJhbmdlJ3MgbWlkcG9pbnQgYXMgdGhlIG9jY3VycmVuY2UgZml4ZWQgYWdlLgoKYGBge3IsIGZpZy5hc3A9MC4zLCBmaWcud2lkdGg9OH0KIyBDb21wdXRlIHRoZSBtZWFuIGFnZSBpbiB0aGUgdGltZSBpbnRlcnZhbApjZXRhY2VhX3BiZGIkYWdlX21lYW4gPC0gKGNldGFjZWFfcGJkYiRtaW5fbWErY2V0YWNlYV9wYmRiJG1heF9tYSkvMgoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LWFnZV9tZWFuLCB5PXJub3JtKGxlbmd0aChhZ2VfbWVhbiksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2VzIiwgbGltaXRzID0gYygwLjcsIDEuMykpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIlJlcGFydGl0aW9uIG9mIiwgZGltKGNldGFjZWFfcGJkYilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgLSBNaWRwb2ludCIpKQoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LWFnZV9tZWFuKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIG51bWJlciBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgKCB0b3RhbCBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAiKSAtIE1pZHBvaW50IikpCmBgYAoKJFx0byQgTnVtZXJvdXMgb2NjdXJyZW5jZXMgc2VlbSB0byBoYXZlIHRoZSBzYW1lIGFnZSBpbnRlcnZhbCBzbyBpbiBvcmRlciB0byBhdm9pZCBjbHVzdGVycyBsZXQncyBkcmF3IHRoZW0gdW5pZm9ybWx5IGluIHRoZWlyIHN0cmF0aWdyYXBoaWMgcmFuZ2UgcmF0aGVyIHRoYW4gdGFraW5nIHRoZSBtaWRwb2ludC4KCmBgYHtyLCBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTh9CiMgRHJhdyBvY2N1cnJlbmNlIGFnZSB1bmlmb3JtYWxseSBpbiB0aGUgdGltZSBpbnRlcnZhbApjZXRhY2VhX3BiZGIkYWdlX3J1bmlmIDwtIG1hcHBseShmdW5jdGlvbihtLCBNKXtydW5pZihuPTEsIG1pbj1tLCBtYXg9TSl9LCBjZXRhY2VhX3BiZGIkbWluX21hLCBjZXRhY2VhX3BiZGIkbWF4X21hKQoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LWFnZV9ydW5pZiwgeT1ybm9ybShsZW5ndGgoYWdlX3J1bmlmKSwgMSwgMC4wNSkpKSArCiAgZ2VvbV9wb2ludChjZXg9MC4xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiT2NjdXJyZW5jZXMiLCBsaW1pdHMgPSBjKDAuNywgMS4zKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZShwYXN0ZSgiUmVwYXJ0aXRpb24gb2YiLCBkaW0oY2V0YWNlYV9wYmRiKVsxXSwgInJlY29yZGVkIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAtIFVuaWZvcm0gZHJhdyIpKQoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgZ2d0aXRsZShwYXN0ZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICggdG90YWwgb2YiLCBkaW0oY2V0YWNlYV9wYmRiKVsxXSwgIikgLSBVbmlmb3JtIGRyYXciKSkKYGBgCgokXHRvJCBUaGUgcmVwYXJ0aXRpb24gc2VlbXMgbXVjaCBzbW9vdGhlciBub3cuCgojIyMgU3Vic2FtcGxpbmcKClRoZXNlIG9jY3VycmVuY2VzIGFyZSB0b28gbnVtZXJvdXMgZm9yIGEgZmFzdGVyIHByZWxpbWluYXJ5IGFuYWx5c2lzLCBsZXQncyByYW5kb21seSBzdWJzYW1wbGUgYSBmcmFjdGlvbiBvZiB0aGVtLgoKYGBge3IsIGZpZy5hc3A9MC4zLCBmaWcud2lkdGg9OH0KY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQgPC0gc2FtcGxlX24oY2V0YWNlYV9wYmRiLCBzaXplPXJvdW5kKGxlbmd0aChhZ2VfcnVuaWYpKjAuMTApKQoKZ2dwbG90KGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmLCB5PXJub3JtKGxlbmd0aChhZ2VfcnVuaWYpLCAxLCAwLjA1KSkpICsKICBnZW9tX3BvaW50KGNleD0wLjUsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJSZXBhcnRpdGlvbiBvZiIsIGRpbShjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZClbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgLSBVbmlmb3JtIGRyYXciKSkKCmdncGxvdChjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgZ2d0aXRsZShwYXN0ZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICggdG90YWwgb2YiLCBkaW0oY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQpWzFdLCAiKSAtIFVuaWZvcm0gZHJhdyIpKQpgYGAKCiRcdG8kIFRoZSBkaXN0cmlidXRpb24gbG9va3Mgc2ltaWxhciwgd2l0aCBzb21lIG5vaXNlIGR1ZSB0byBoaWdoZXIgdmFyaWFuY2Ugd2l0aCBzbWFsbGVyIHNhbXBsZS4KCmBgYHtyfQp3cml0ZShjZXRhY2VhX3BiZGIkYWdlX21lYW4sIGZpbGUgPSAiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9vY2N1cnJlbmNlc19tZWFuX2FnZS5jc3YiLCBzZXA9IjsgIiwgbmNvbHVtbnMgPSBkaW0oY2V0YWNlYV9wYmRiKVsxXSkKd3JpdGUoY2V0YWNlYV9wYmRiJGFnZV9ydW5pZiwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2FnZV9ydW5pZl9hZ2UuY3N2Iiwgc2VwPSI7ICIsIG5jb2x1bW5zID0gZGltKGNldGFjZWFfcGJkYilbMV0pCndyaXRlKGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkJGFnZV9ydW5pZiwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2FnZV9ydW5pZl9hZ2Vfc3Vic2FtcGxlZC5jc3YiLCBzZXA9IjsgIiwgbmNvbHVtbnMgPSBkaW0oY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQpWzFdKQpgYGAKCiMjIFJlcGFydGl0aW9uIGFtb25nIGFjY2VwdGVkIHJhbmtzCiMjIyBQaWUgY2hhcnQKCmBgYHtyLCBmaWcud2lkdGg9Nn0KZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9ZmFjdG9yKHJlY29yZF90eXBlKSwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJjb3VudCIpICsKICBjb29yZF9wb2xhcigieSIpICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gTlVMTCwgdGl0bGUgPSAiUmVwYXJ0aXRpb24gb2Ygb2NjdXJyZW5jZXMgYW1vbmcgYWNjZXB0ZWQgcmFua3MiKQpgYGAKCiRcdG8kIEhhbGYgb2YgdGhlIG9jY3VycmVuY2VzIGFyZSBpZGVudGlmaWVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgc2VjaWVzIGFuZCAxLzMgYXQgdGhlIGdlbnVzIG9yIGZhbWlseS4KClNvbWUgY2xhZGVzIGFyZSB1bnJhbmtlZCA6CgpgYGB7cn0KdGFibGUoYXMuY2hhcmFjdGVyKGNldGFjZWFfcGJkYltjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuaz09InVucmFua2VkIGNsYWRlIixdJGFjY2VwdGVkX25hbWUpKQpgYGAKCiMjIyBUaW1lIHJlcGFydGl0aW9uIGJ5IHJhbmsKCmBgYHtyLCBmaWcuYXNwPTAuNCwgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIGFlcyh4PS1hZ2VfcnVuaWYsIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAoMC4xIE15IHRpbWUgYmlucyksIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzPSJmcmVlIikKYGBgCgokXHRvJCBBcHBhcmVudCBodWdlIGNsdXN0ZXIgb2Ygb2NjdXJyZW5jZXMgaW4gcmVjZW50IHRpbWVzLCB3aXRoIHZlcnkgcHJlY2lzZSBkYXRpbmcgPSBBcnRlZmFjdCBkdWUgdG8gdGhlICJQdWxsIG9mIHRoZSBSZWNlbnQiIGVmZmVjdCA/IAoKJFxpbXBsaWVzJCBXZSBkZWNpZGVkIHRvICoqcmVtb3ZlIGFsbCBMYXRlIFBsZWlzdG9jZW5lIGFuZCBIb2xvY2VuZSBvY2N1cnJlbmNlcyoqICh0aHVzIHNldHRpbmcgdGhlICRcb21lZ2EkLXNhbXBsaW5nIHRvIDApIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgYmlhcy4KCmBgYHtyfQpDZXRhY2VhX29jYyA8LSBjZXRhY2VhX3BiZGJbY2V0YWNlYV9wYmRiJGFnZV9ydW5pZiA+IDAuMTI2LF0KCmRhdGEuZnJhbWUoY2V0YWNlYV9wYmRiID0gZGltKGNldGFjZWFfcGJkYilbMV0sCiAgICAgICAgICAgQ2V0YWNlYV9vY2MgPSBkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHJlbW92ZWQgPSBkaW0oY2V0YWNlYV9wYmRiKVsxXS1kaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHJvdy5uYW1lcyA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KZ2dwbG90KENldGFjZWFfb2NjWyFDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3Vic3BlY2llcyIsICJpbmZyYW9yZGVyIiksXSwgYWVzKHg9LWFnZV9ydW5pZiwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICgwLjUgTXkgdGltZSBiaW5zKSwgYnkgYWNjZXB0ZWQgcmFuayIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXM9ImZyZWUiKQpgYGAKCiRcdG8kIFdlIG9ic2VydmUgc2ltaWxhciB0cmVuZHMgYXQgZWFjaCByYW5rLCB3aXRoIHBlYWtzIGF0IH4xNU15IGFuZCB+NU15LgoKIyMjIFJlZHVuZGFuY3kgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMH0KZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCB0YWJsZShhY2NlcHRlZF9uYW1lKVthY2NlcHRlZF9uYW1lXSksIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2JhcihzdGF0PSJjb3VudCIpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gIkFjY2VwdGVkIG5hbWVzIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgb2NjdXJyZW5jZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lLCBieSBhY2NlcHRlZCByYW5rIikgKwogIGZhY2V0X2dyaWQoLiB+IGFjY2VwdGVkX3JhbmssIHNjYWxlcz0iZnJlZV94IikKYGBgCgokXHRvJCB+SGFsZiBvZiBzcGVjaWVzL2dlbmVyYS9zdWJmYW1pbGllcyBoYXZlIG9ubHkgb25lIHNwZWNpbWVuIGJ5IGFjY2VwdGVkIG5hbWUsIGJ1dCBpdCBjb3VsZCBnbyB1cCB0byB+NTAgd2l0aGluIHRoZSBzYW1lIHNwZWNpZXMgYW5kIH4yMDAgb2NjdXJyZW5jZXMgd2l0aGluIHRoZSBzYW1lIHN1Ym9yZGVyLiAqKkluIG91ciBtb2RlbCBhbGwgc3BlY2llcyBhcmUgdXBwb3NlZCB0byBoYXZlIHRoZSBzYW1lIGFidW5kYW5jZSAoaWRlbnRpY2FsIHNhbXBsaW5nIHJhdGVzIGFtb25nIGJyYW5jaGVzKSwgc28gdGhvc2UgaHVnZSBkaWZmZXJlbmNlcyB3aWxsIGhhdmUgdG8gYmUgbWl0aWdhdGVkLioqIFNlZSBsYXRlciBmb3IgYSBxdWFudGlmaWNhdGlvbiBvZiB0aGlzIGRpc2NyZXBhbmN5LgoKJFxpbXBsaWVzJCBPdXIgZ29hbCBub3cgd2lsbCBiZSB0byBjb3JyZWN0IHRoaXMgYWJ1bmRhbmNlIGJpYXMuCgojIyBUaW1lIGludGVydmFscyA9IHN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IChtaW5pbXVtIGFuZCBtYXhpbXVtIGFnZXMpCgpgYGB7ciB9CiMgR2V0IHRoZSBzdHJhdGlncmFwaGljIGludGVydmFsIG9mIHRpbWUgdW5jZXJ0YWludHkKQ2V0YWNlYV9vY2MkYWdlX2ludGVydmFsIDwtIG1hcHBseShmdW5jdGlvbihtaW5fYWdlLCBtYXhfYWdlKXtwYXN0ZSgiWyIsLW1heF9hZ2UsIiwgIiwtbWluX2FnZSwiXSIsIHNlcCA9ICIiKX0sIENldGFjZWFfb2NjJG1pbl9tYSwgQ2V0YWNlYV9vY2MkbWF4X21hKQoKZ2dwbG90KENldGFjZWFfb2NjLCBhZXMoeD0tbWF4X21hLCB5PWFnZV9pbnRlcnZhbCkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhZ2VfaW50ZXJ2YWwsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWdlX2ludGVydmFsLCAtYWdlX21lYW4pLCBjb2xvcj0tYWdlX21lYW4pKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBZ2UgaW50ZXJ2YWxzIikgKwogIGxhYnMoY29sb3VyPSJNZWFuIGFnZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgYWdlIGludGVydmFscyIpICsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMgVGltZSByYW5nZXMgPSBkdXJhdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbHMgKG1heGltdW0gYWdlIC0gbWluaW11bSBhZ2UpCiMjIyBDb3VudCBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lCgpDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZQoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMH0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpteV9icmVha3MgPC0gYygxLDMsMTAsMzUsMTAwLG1heChDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50KSkKCiMgZ2dwbG90KENldGFjZWFfb2NjWyEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiLCAiZmFtaWx5IikpLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKIyAgIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBY2NlcHRlZCByYW5rcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik5iIG9mIG9jY3VycmVuY2VzIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yKSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgYWdlIHJhbmdlcyBmb3IgYWxsIHNwZWNpZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZ2VudXMiLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuMykgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VudXMiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT02KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBhZ2UgcmFuZ2VzIGZvciBhbGwgZ2VuZXJhIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IixdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwojICAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC4zKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VudXMiKSArCiMgICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBhZ2UgcmFuZ2VzIChmYW1pbGllcykiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgU29tZSBvY2N1cnJlbmNlcyBoYXZlIHRvbyBtdWNoIGFnZSB1bmNlcnRhaW50eSAodW5yZWxhdGVkIHRvIHNwZWNpZXMgbG9uZ2V2aXR5IGluIGV4dHJlbWUgY2FzZXMgbGlrZSB0aGUgb25lIHNwYW5uaW5nIDYwTXkpLCB0aGV5IHJpc2sgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIHNwZWNpZXMgZHVyYXRpb25zLgoKIyMjIFJlbW92ZSBvY2N1cnJlbmNlcyB3aXRoIGhpZ2hseSB1bmNlcnRhaW4gZGF0aW5nIChyYW5nZSA+IDEwTXkpCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMH0KIyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFscwpDZXRhY2VhX29jYyRhZ2VfcmFuZ2UgPC0gQ2V0YWNlYV9vY2MkbWF4X21hLUNldGFjZWFfb2NjJG1pbl9tYQoKZ2dwbG90KENldGFjZWFfb2NjLCBhZXMoeD1hZ2VfcmFuZ2UsIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UgdW5jZXJ0YWludHkgcmFuZ2UgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBvY2N1cnJlbmNlcyIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSA5LjUsIHkgPSAwLCB4ZW5kID0gOS41LCB5ZW5kPTEwNTApLCBjb2xvcj0iYmxhY2siLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgYWdlIHVuY2VydGFpbnR5IHJhbmdlIGFuZCByZW1vdmFsIGxpbWl0IChkYXNoZWQgbGluZSkiKQpgYGAKCk1vc3Qgb2Ygb2NjdXJyZW5jZXMgc2hvdyBsZXNzIHRoYW4gMTAgTXkgYWdlIHVuY2VydGFpbnR5LCBsZXQncyBrZWVwIG9ubHkgdGhlc2Ugb25lcy4KCmBgYHtyfQpkYXRhLmZyYW1lKGFsbF9yYW5nZXMgPSBkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHNtYWxsZXJfMTBNeSA9IGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSlbMV0sCiAgICAgICAgICAgcmVtb3ZlZCA9IGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdKVsxXSwgcm93Lm5hbWVzID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpCmBgYAoKYGBge3IgZmlnLmhlaWdodD02fQojIGdncGxvdChDZXRhY2VhX29jYywgYWVzKHg9YWdlX3J1bmlmLCB5PWFnZV9yYW5nZSkpICsKIyAgIGdlb21fcG9pbnQoYWxwaGE9MC4wNSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVW5pZm9ybWx5IGRyYXduIGFnZSAoTXkpIikgKwojICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQWdlIHVuY2VydGFpbnR5IHJhbmdlIChNeSkiKSArCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIGFnZSB1bmNlcnRhaW50eSByYW5nZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWdlX3JhbmdlICE9IDYzLjQxMixdLCBhZXMoeD1hZ2VfcnVuaWYsIHk9YWdlX3JhbmdlKSkgKwogIGdlb21fcG9pbnQoYWxwaGE9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlVuaWZvcm1seSBkcmF3biBhZ2UgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UgdW5jZXJ0YWludHkgcmFuZ2UgKE15KSIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB5ID0gMTAsIHhlbmQ9NjAsIHllbmQgPSAxMCksIGNvbG9yPSJibGFjayIsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzJyBhZ2UgdW5jZXJ0YWludHkgcmFuZ2UgYW5kIHJlbW92YWwgbGltaXQgKGRhc2hlZCBsaW5lKSIpCgojIGdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9YWdlX3J1bmlmLCB5PWFnZV9yYW5nZSkpICsKIyAgIGdlb21fcG9pbnQoYWxwaGE9MC4wNSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVW5pZm9ybWx5IGRyYXduIGFnZSAoTXkpIikgKwojICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQWdlIHVuY2VydGFpbnR5IHJhbmdlIChNeSkiKSArCiMgICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIGFnZSB1bmNlcnRhaW50eSByYW5nZSIpCgpoaXN0KC1DZXRhY2VhX29jYyRhZ2VfcnVuaWYsIGJyZWFrcyA9IDUwLCBjb2w9InJlZCIsIHByb2JhYmlsaXR5PVQsIG1haW49IkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcywgd2l0aCAocmVkKSBvZiB3aXRob3V0IChibHVlKSByZWNlbnQgc2FtcGxlcyIsIHhsYWIgPSAiVGltZSAoTXkpIiwgeWxhYiA9ICJQcm9wb3J0aW9uIG9mIG9jY3VycmVuY2VzIikKaGlzdCgtQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0kYWdlX3J1bmlmLCBicmVha3MgPSA1MCwgY29sPSJibHVlIiwgcHJvYmFiaWxpdHk9VCwgZGVuc2l0eT1ULCBhZGQ9VCkKYGBgCgokXHRvJCBUaGUgcmVtb3ZhbCBvZiBoaWdobHkgdW5jZXJ0YWluIG9jY3VycmVuY2VzIHNlZW1zIHRvIGJlIG9ubHkgYSBsaXR0bGUgYmlhc2VkLCBldmVuIGlmIHVuY2VydGFpbnR5IGdsb2JhbGx5IGluY3JlYXNlcyB3aXRoIGFnZS4KCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEwfQpteV9icmVha3MgPC0gYygxLDMsMTAsMzUsMTAwLG1heChDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50KSkKCiMgZ2dwbG90KENldGFjZWFfb2NjWyEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiLCAiZmFtaWx5IikpICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKIyAgIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBY2NlcHRlZCByYW5rcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkFnZSByYW5nZXMiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yKSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgYWdlIHJhbmdlcyAoc3BlY2llcykiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZ2VudXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCB4ZW5kID0gLW1pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiR2VudXMiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT02KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgYWdlIHJhbmdlcyAoZ2VuZXJhKSIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgojIGdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09ImZhbWlseSIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwojICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKIyAgIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuNSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwojICAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwojICAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiMgICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAojICAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgYWdlIHJhbmdlcyAoZmFtaWxpZXMpIikgKwojICAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFNvbWUgc3BlY2llcyAob3Igb3RoZXIgcmFua3MpIGhhdmUgc2V2ZXJhbCBvY2N1cnJlbmNlcyB3aXRoIHNldmVyYWwgdGltZSByYW5nZXMsICoqbGV0J3MgY29tYmluZSB0aGVtIGludG8gYSB1bmlxdWUgcmFuZ2UgY292ZXJpbmcgYWxsIHRoZSBvdGhlcnMqKi4KCiMjIENvbWJpbmVkIHRpbWUgcmFuZ2VzID0gdW5pcXVlIHRpbWUgcmFuZ2UgZm9yIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgbmFtZSAod2l0aG91dCB0aGUgYmlnZ2VzdCBvbmVzKQoKYGBge3IsIGZpZy5hc3A9MC41LCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0V9CiMgR2V0IHRoZSBtaW5pbXVuIG9mIHRoZSBtaW5pbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttaW4oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0kbWluX21hKX0pCiMgR2V0IHRoZSBtYXhpbXVtIG9mIHRoZSBtYXhpbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtYXhfbWF4X21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0kbWF4X21hKX0pCiMgR2V0IHRoZSBjb21iaW5lZCB0aW1lIGludGVydmFsCkNldGFjZWFfb2NjJGFnZV9jb21iaW5lZF9pbnRlcnZhbCA8LSBtYXBwbHkoZnVuY3Rpb24obWluX21pbl9hZ2UsIG1heF9tYXhfYWdlKXtwYXN0ZSgiWyIsLW1heF9tYXhfYWdlLCIsICIsLW1pbl9taW5fYWdlLCJdIiwgc2VwID0gIiIpfSwgQ2V0YWNlYV9vY2MkbWluX21pbl9tYSwgQ2V0YWNlYV9vY2MkbWF4X21heF9tYSkKIyBHZXQgdGhlIGNvbWJpbmVkIHRpbWUgaW50ZXJ2YWwgbWVhbgpDZXRhY2VhX29jYyRhZ2VfY29tYmluZWRfbWVhbiA8LSAoQ2V0YWNlYV9vY2MkbWluX21pbl9tYSArIENldGFjZWFfb2NjJG1heF9tYXhfbWEpLzIKIyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb21iaW5lZCB0aW1lIGludGVydmFscwpDZXRhY2VhX29jYyRhZ2VfY29tYmluZWRfcmFuZ2UgPC0gQ2V0YWNlYV9vY2MkbWF4X21heF9tYS1DZXRhY2VhX29jYyRtaW5fbWluX21hCgojIGdncGxvdChDZXRhY2VhX29jY1shKENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiwgImZhbWlseSIpKSAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBY2NlcHRlZCByYW5rcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGNvbWJpbmVkIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPWFjY2VwdGVkX25hbWVfY291bnQpLCBhcnJvdz1hcnJvdyhlbmRzID0gImJvdGgiLCBhbmdsZT05MCwgbGVuZ3RoID0gdW5pdCgxLCAibW0iKSksIGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTEsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiQWdlIHJhbmdlcyIpICsKICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTIpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBjb21iaW5lZCBhZ2UgcmFuZ2VzIChzcGVjaWVzKSIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJnZW51cyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbmVyYSIpICsKICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTYpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBjb21iaW5lZCBhZ2UgcmFuZ2VzIChnZW5lcmEpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCiMgZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiMgICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKIyAgIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJGYW1pbGllcyIpICsKIyAgIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGNvbWJpbmVkIGFnZSByYW5nZXMgKGZhbWlsaWVzKSIpICsKIyAgIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKYGBgCgojIyBPY2N1cnJlbmNlIGRlbnNpdHkgPSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgdW5pdCBvZiB0aW1lLCBpbiB0aGUgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbCBvZiBhIHRheG9uCiMjIyBEZW5zaXR5IGRpc3RyaWJ1dGlvbnMKClBsb3QgdGhlIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgZm9yIGVhY2ggdGF4b25vbWljIHJhbmssIGFuZCBoaWdobGlnaHQgdGhlIHJvbGUKCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTExfQojIEdldCB0aGUgZGVuc2l0eSBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgaW50ZXJ2YWxzCkNldGFjZWFfb2NjJG9jY3VycmVuY2VfZGVuc2l0eSA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50L0NldGFjZWFfb2NjJGFnZV9yYW5nZQoKZ2dwbG90KENldGFjZWFfb2NjWyEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInN1YnNwZWNpZXMiLCAiaW5mcmFvcmRlciIpKSAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD1vY2N1cnJlbmNlX2RlbnNpdHkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvY2N1cnJlbmNlIGRlbnNpdHksIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIERlbnNpdHkgbG9naWNhbGx5IGluY3JlYXNlcyB3aXRoIHRheGEgcmFua3MsIGJ1dCB0aGUgZGlzdHJpYnV0aW9ucyBmb3Igc3BlY2llcyBhbmQgZ2VuZXJhIGRyYW1hdGljYWxseSBzcHJlYWQgb3ZlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZS4KCiMjIENvcnJlbGF0aW9uIGJldHdlZW4gdGltZSByYW5nZSBhbmQgYWdlCgpJZiB3ZSB3YW50IHRvIGNvcnJlY3Qgc3BlY2llcyBhYnVuZGFuY2UgZGlmZmVyZW5jZXMgYmFzZWQgb24gdGhlIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIGFnZSBpbnRlcnZhbCwgdGhvc2UgZmFjdG9ycyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aW1lIGluIG9yZGVyIHRvIGF2b2lkIHBlbmFsaXppbmcgcGVyaW9kcyB3aXRoIGhpZ2hlciBkZW5zaXRpZXMuCgpMZXQncyBjb21wYXJlIHRoZSBvY2N1cnJlbmNlIGRlbnNpdGVzIGNvbXB1dGVkIHdpdGggdGhlIGluaXRpYWwgdGltZSByYW5nZXMgYW5kIHRoZSAqY29tYmluZWQgZGVuc2l0aWVzKiBjb21wdXRlZCB3aXRoIHRoZSBjb21iaW5lZCByYW5nZXMuCgpgYGB7cn0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgojIEZ1bmN0aW9uIHRvIHBsb3QgbGluZWFyIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzCmxtX2VxbiA8LSBmdW5jdGlvbihkZil7CiAgICBtIDwtIGxtKHkgfiB4LCBkZik7CiAgICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBhICsgYiAlLiUgaXRhbGljKHgpKiIsIn5+aXRhbGljKHIpXjJ+Ij0ifnIyLCAKICAgICAgICAgbGlzdChhID0gZm9ybWF0KHVubmFtZShjb2VmKG0pWzFdKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgICAgYiA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsyXSksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkKICAgIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7Cn0KCiMgS2VlcCBvbmx5IG9uZSBwb2ludCBieSBpZGVudGljYWwgdGltZSBpbnRlcnZhbAphZ2VfaW50ZXJ2YWxfdGFibGUgPC0gdGFibGUoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9pbnRlcnZhbCkKCmludGVydmFsX21lYW5fYWdlIDwtIHNhcHBseShuYW1lcyhhZ2VfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2ludGVydmFsPT14LF0kYWdlX21lYW5bMV19KQoKaW50ZXJ2YWxfZGVuc2l0eSA8LSBzYXBwbHkobmFtZXMoYWdlX2ludGVydmFsX3RhYmxlKSwgZnVuY3Rpb24oeCl7Q2V0YWNlYV9vY2NbY29uZGl0aW9ucyAmIENldGFjZWFfb2NjJGFnZV9pbnRlcnZhbD09eCxdJG9jY3VycmVuY2VfZGVuc2l0eVsxXX0pCgpkZl9kZW5zaXR5IDwtIGRhdGEuZnJhbWUoeD1pbnRlcnZhbF9tZWFuX2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHk9aW50ZXJ2YWxfZGVuc2l0eSkKCmdncGxvdChkZl9kZW5zaXR5LCBhZXMoeD14LCB5PXkpKSArIAogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kPWxtKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJDb21iaW5lZCBkZW5zaXR5IikgKwogIGdndGl0bGUoIkNvcnJlbGF0aW9uIGJldHdlZW4gZGVuc2l0eSBhbmQgYWdlIikgKwogIGdlb21fdGV4dCh4ID0gMzUsIHkgPSAyNSwgbGFiZWwgPSBsbV9lcW4oZGZfZGVuc2l0eSksIHBhcnNlID0gVFJVRSkKCiMgS2VlcCBvbmx5IG9uZSBwb2ludCBieSBpZGVudGljYWwgY29tYmluZWQgdGltZSBpbnRlcnZhbAphZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUgPC0gdGFibGUoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9jb21iaW5lZF9pbnRlcnZhbCkKCmNvbWJpbmVkX2ludGVydmFsX21lYW5fYWdlIDwtIHNhcHBseShuYW1lcyhhZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX2ludGVydmFsPT14LF0kYWdlX2NvbWJpbmVkX21lYW5bMV19KQoKQ2V0YWNlYV9vY2Mkb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX25hbWVfY291bnQvQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX3JhbmdlCgpjb21iaW5lZF9pbnRlcnZhbF9kZW5zaXR5IDwtIHNhcHBseShuYW1lcyhhZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX2ludGVydmFsPT14LF0kb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5WzFdfSkKCmNvbWJpbmVkX2RmX2RlbnNpdHkgPC0gZGF0YS5mcmFtZSh4PWNvbWJpbmVkX2ludGVydmFsX21lYW5fYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1jb21iaW5lZF9pbnRlcnZhbF9kZW5zaXR5KQoKZ2dwbG90KGNvbWJpbmVkX2RmX2RlbnNpdHksIGFlcyh4PXgsIHk9eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2Q9bG0pICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkNvbWJpbmVkIGRlbnNpdHkiKSArCiAgZ2d0aXRsZSgiQ29ycmVsYXRpb24gYmV0d2VlbiBjb21iaW5lZCBkZW5zaXR5IGFuZCBhZ2UiKSArCiAgZ2VvbV90ZXh0KHggPSAxNSwgeSA9IDYsIGxhYmVsID0gbG1fZXFuKGNvbWJpbmVkX2RmX2RlbnNpdHkpLCBwYXJzZSA9IFRSVUUpCmBgYAoKJFx0byQgVGhlIGRlbnNpdHkgYmFzZWQgb24gY29tYmluZWQgcmFuZ2VzIHNlZW1zIGxlc3MgdGltZS1kZXBlbmRhbnQgdGhhbiB0aGUgZGVuc2l0eSBiYXNlZCBvbiBpbml0aWFsIHRpbWUgcmFuZ2VzLiBXZSB3aWxsIHRoZXJlZm9yZSB1c2UgdGhlIGNvbWJpbmVkIGRlbnNpdHkgZm9yIG91ciBjb3JyZWN0aW9ucy4KCiMjIFN1YnNhbXBsaW5nIG9jY3VycmVuY2VzIGJ5IGhvbW9nZW5pemluZyB0aGUgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5CgoqKlN1YnNhbXBsaW5nIGJ5IGhvbW9nZW5pemF0aW9uKiogPSByZWR1Y2luZyB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiBoaWdoIGFuZCBsb3cgb2NjdXJyZW5jZSBkZW5zaXRpZXMgYW1vbmcgdGF4YSBieSBzdWJzYW1wbGluZyBwcmVmZXJlbmNpYWxseSB0aGUgZGVuc2VzdCBvbmVzLgoKIyMjIENvbXBhcmUgZGVuc2l0aWVzIGJ5IGFjY2VwdGVkIG5hbWUgY291bnQgKHNwZWNpZXMgb25seSkKCkxldCdzIGZvY3VzIG5vdyBvbiB0aGUgb2NjdXJyZW5jZXMgYWNjZXB0ZWQgYXQgdGhlIHNwZWNpZXMgbGV2ZWwgYmVjYXVzZSB0aGV5IGFyZSB0aGUgb25lIGZvciB3aGljaCB3ZSBjYW4gY29ycmVjdCB0aGUgYWJ1bmRhbmNlIGJpYXMgYnkgc3Vic2FtcGxpbmcgdGhlIG1vc3QgY29uY2VudHJhdGVkIGNvbWJpbmVkIGludGVydmFscy4KCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEyfQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAKCiMgZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9b2NjdXJyZW5jZV9kZW5zaXR5LCBmaWxsPWZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KSkpICsKIyAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiMgICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2Ygb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMiKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIiwgbmFtZT0iQ29tYmluZWQgZGVuc2l0eSBvZiBvY2N1cnJlbmNlcyAobnVtYmVyL015KSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBjb21iaW5lZCBvY2N1cnJlbmNlIGRlbnNpdHkgYW1vbmcgc3BlY2llcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgVGhlaXIgaXMgYSBodWdlIHNwYW4gb2YgZGVuc2l0aWVzIGRyaXZlbiBieSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGZvciB0aGUgc2FtZSBzcGVjaWVzIHRoYXQgd2UgY2FuIHJlZHVjZSBieSBzdWJzYW1wbGluZyB0aGUgbW9zdCBjb25jZW50cmF0ZWQgaW50ZXJ2YWxzLgoKIyMjIEltcGFjdCBvZiBjb3JyZWN0aW5nIHN1YnNhbXBsaW5nIG9uIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyAoc3BlY2llcyBvbmx5KQoKYGBge3IsIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9MTJ9CmNvbmRpdGlvbnMgPC0gQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMAoKIyBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwojICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4wNSkgKwojICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkNvbWJpbmVkIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiMgICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2YgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdKVsxXSwgIikiLCBzZXA9IiIpKSArCiMgICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgojIEFkZCBhdCBsZWFzdCBvbmUgb2NjdXJyZW5jZSBvZiBlYWNoIHNwZWNpZXMKQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSBjKCkKQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCA8LSBjKCkKZm9yIChpIGluIGFzLm51bWVyaWMocm93Lm5hbWVzKENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSkpKXsKICByb3cgPC0gQ2V0YWNlYV9vY2NbYXMuY2hhcmFjdGVyKGkpLF0KICBpZiAoIShyb3ckYWNjZXB0ZWRfbmFtZSAlaW4lIENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSkpewogICAgQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSByYmluZChDZXRhY2VhX29jY19zYW1wbGVkLCByb3cpCiAgfWVsc2V7CiAgICBDZXRhY2VhX29jY19ub3RzYW1wbGVkIDwtIHJiaW5kKENldGFjZWFfb2NjX25vdHNhbXBsZWQsIHJvdykKICB9Cn0KCiMgQWRkIG9jY3VycmVuY2VzIGluIHRoZSByZW1hbmluZyBvbmVzLCBieSB1bmRlcndlaWdodGluZyBkZW5zZSBzcGVjaWVzCkNldGFjZWFfb2NjX3NhbXBsZWQgPC0gcmJpbmQoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9ODAwLWRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0PTEvQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkqKjMpKQoKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQsIDEsIGZ1bmN0aW9uKFgpe21pbihDZXRhY2VhX29jY19zYW1wbGVkW0NldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdLF0kbWluX21hKX0pCkNldGFjZWFfb2NjX3NhbXBsZWQkbWF4X21heF9tYSA8LSBhcHBseShDZXRhY2VhX29jY19zYW1wbGVkLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWU9PVhbImFjY2VwdGVkX25hbWUiXSxdJG1heF9tYSl9KQpDZXRhY2VhX29jY19zYW1wbGVkJGFnZV9jb21iaW5lZF9yYW5nZSA8LSBDZXRhY2VhX29jY19zYW1wbGVkJG1heF9tYXhfbWEtQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtaW5fbWluX21hCkNldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWUpW3hdfSkKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkgPC0gQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lX2NvdW50L0NldGFjZWFfb2NjX3NhbXBsZWQkYWdlX2NvbWJpbmVkX3JhbmdlCgoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSwgZmlsbD1mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0ibG9nMTAiLCBuYW1lPSJDb21iaW5lZCBkZW5zaXR5IG9mIG9jY3VycmVuY2VzIChudW1iZXIvTXkpIiwgbGltaXRzPWMoMC4xLCAxMDAwKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgbmFtZSBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb25zIG9mIGNvbWJpbmVkIG9jY3VycmVuY2UgZGVuc2l0eSBhbW9uZyBzcGVjaWVzLCBhZnRlciBzYW1wbGluZyAobiA9ICIsIGRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwgIikiLCBzZXA9IiIpKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9uYW1lX2NvdW50IH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFN1YnNhbXBsaW5nIGJ5IGhvbW9nZW5pemF0aW9uIHN1Y2Nlc3NmdWxseSByZWR1Y2VzIHRoZSBkZW5zaXR5IHNwYW4gZnJvbSAyIHRvIDEgb3JkZXIgb2YgbWFnbml0dWRlLgoKIyMjIEltcGFjdCBvZiBzdWJzYW1wbGluZyBvbiBvY2N1cnJlbmNlcyByZXBhcnRpdGlvbiAoc3BlY2llcyBvbmx5KQoKU2VlIHdoYXQgb3VyIGRpc3RyaWJ1dGlvbnMgbG9vayBsaWtlIGFmdGVyIHN1YnNhbXBsaW5nIDoKCmBgYHtyLCBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEyfQpicmVha3MgPC0gYygwLjEyNSwwLjI1LDAuNSwxLDIsNCw4LDE2KQoKIyBnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiMgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9b2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKIyAgIGdlb21fcG9pbnQoYWVzKHg9LWFnZV9ydW5pZiksIGNvbD0icmVkIiwgY2V4PTAuNSwgYWxwaGE9MC41KSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiMgICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiU3BlY2llcyIpICsKIyAgIGxhYnMoY29sb3VyPSJPY2N1cnJlbmNlXG5kZW5zaXR5IikgKwojICAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPWJyZWFrcywgbGFiZWxzPWJyZWFrcykgKyAKIyAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHJhbmdlcywgYmVmb3JlIGNvcnJlY3Rpbmcgc2FtcGxpbmcgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdKVsxXSwgIikiLCBzZXA9IiIpKQoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9b2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0wLjUsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiU3BlY2llcyIpICsKICBsYWJzKGNvbG91cj0iT2NjdXJyZW5jZVxuZGVuc2l0eSIpICsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHJhbmdlcywgYWZ0ZXIgc3Vic2FtcGxpbmcgYnkgaG9tb2dlbml6YXRpb24gKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2Nfc2FtcGxlZClbMV0sICIpIiwgc2VwPSIiKSkKYGBgCgokXHRvJCBTb21lIGhpZ2hseSBkZW5zZSBjbHVzdGVyIGJlY2FtZSBtdWNoIG1vcmUgc2ltaWxhciB0byB0aGUgb3RoZXJzLgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuM30KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9InJlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIHNwZWNpZXMgb2NjdXJyZW5jZSBudW1iZXIgdGhyb3VnaCB0aW1lIChuID0gIiwgZGltKENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSlbMV0sICIpIiwgc2VwPSIiKSkKCmdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImJsdWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZShwYXN0ZSgiRXZvbHV0aW9uIG9mIHRoZSBzcGVjaWVzIG9jY3VycmVuY2UgbnVtYmVyIHRocm91Z2ggdGltZSwgYWZ0ZXIgc3Vic2FtcGxpbmcgYnkgaG9tb2dlbml6YXRpb24gKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2Nfc2FtcGxlZClbMV0sICIpIiwgc2VwPSIiKSkKYGBgCgpJZiB3ZSBzdXBlcnBvc2UgdGhlc2UgMiBwbG90cyA6CgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC40fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0icmVkIikgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB0aGVtZV92b2lkKCkKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpCmBgYAoKJFx0byQgV2UgZ2V0IHRoZSBuZXcgc3BlY2llcyBvY2N1cnJlbmNlIHJlcGFydGl0aW9uIGFmdGVyIHN1YnNhbXBsaW5nLCB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIGRvaW5nIGluZmVyZW5jZSB3aXRoIHRoZSBvY2N1cnJlbmNlIGJpcnRoLWRlYXRoIG1vZGVsLgoKIyMgQ29tcGFyZSB3aXRoIGEgUG9pc3NvbiBzYW1wbGluZyBwcm9jZXNzCgpJbiBvcmRlciB0byBjaGVjayBpZiB0aGUgZGF0YSBmaXQgb3VyIGFzc3VtcHRpb25zIG9mIGNvbnN0YW50LWZvc3NpbGlzYXRpb24tcmF0ZSBQb2lzc29uIHNhbXBsaW5nIHdlIGNvbXBhcmUgdGhlIG9ic2VydmVkIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgZXhwZWN0ZWQgb25lcy4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIG51bWJlciBvZiB0YXhhIHJlcHJlc2VudGVkIGJ5IDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBhbmQgdGhlIG9uZSB0aGF0IHdlIHdvdWxkIGV4cGVjdCBmb3IgYSBnaXZlbiBkaXN0cmlidXRpb24gb2YgY29tYmluZWQgYWdlIHJhbmdlcyAoc2VlbiBoZXJlIGFzIGEgcHJveHkgZm9yIHNwZWNpZXMgZHVyYXRpb24pLgoKYGBge3IsIGZpZy5hc3A9MC41LCBmaWcud2lkdGg9MTB9CmNvbmRpdGlvbnMgPC0gIShDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3Vic3BlY2llcyIsICJpbmZyYW9yZGVyIikpICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1hZ2VfY29tYmluZWRfcmFuZ2UsIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsgCiAgI2dlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIHJhbmdlIChNeSkiKSArCiAgI3NjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiQ291bnQgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBnZ3RpdGxlKCJPYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIGNvbWJpbmVkIGFnZSByYW5nZXMiKSArCiAgZmFjZXRfZ3JpZCguIH4gYWNjZXB0ZWRfcmFuaywgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwgeT0odGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50KSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCBjb2w9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJPYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIHRoZSBudW1iZXIgb2YgYWNjZXB0ZWQgbmFtZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCkluIGEgUG9pc3NvbiBwcm9jZXNzIHdpdGggb2NjdXJyZW5jZSBzYW1wbGluZyByYXRlICRcb21lZ2EkIGFuZCBmb3IgYSBnaXZlbiB0aW1lIGludGVydmFsIG9mIGxlbmd0aCAkdCQsIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgJE5fdCA9IGskIG9jY3VycmVuY2VzIGlzIGdpdmVuIGJ5IHRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbiBvZiBtZWFuIG9mIHBhcmFtZXRlciAkXG9tZWdhXHRpbWVzIHQkIDogCgokJFxtYXRoYmJ7UH0oTl90PWspID0gZV57LVxvbWVnYSB0fVxmcmFjeyhcb21lZ2EgdClea317ayF9JCQKClNvIGluIG9yZGVyIHRvIGhhdmUgdGhlIGFic29sdXRlIHByb2JhYmlsaXR5IG9mIG9ic2VydmluZyAkTl8wID0gbiQgb2NjdXJyZW5jZXMgd2UgaGF2ZSB0byBpbnRlZ3JhdGUgb3ZlciB0aGUgZnVsbCBkaXN0cmlidXRpb24gb2YgYWdlIHJhbmdlcyAkdCQsIGNhbGxlZCAkZih0KSQgOgoKJCRcbWF0aGJie1B9KE5fMCA9IG4pID0gXGludF90IFAoTl90ID0gbikgZih0KSBkdCA9IFxpbnRfdCBlXnstXG9tZWdhIHR9XGZyYWN7KFxvbWVnYSB0KV5ufXtuIX0gZih0KSBkdCQkCgpGaXJzdCwgIGFwcHJveGltYXRlIHRoaXMgZGlzdHJpYnV0aW9uIDoKCmBgYHtyfQpyYW5nZV9kZW5zaXR5IDwtIGFwcHJveGZ1bihkZW5zaXR5KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZVtpcy5maW5pdGUoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKV0pKQoKaGlzdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UsIHByb2JhYmlsaXR5ID0gVCwgYnJlYWtzID0gMjAsIG1haW49IkRlbnNpdHkgYXBwcm94aW1hdGlvbiBvZiB0aGUgZW1waXJpY2FsIHJhbmdlIGRpc3RyaWJ1dGlvbiIsIHhsYWIgPSAiQWdlIHJhbmdlIChNeSkiKQpsaW5lcygxOjEwMC81LCByYW5nZV9kZW5zaXR5KDE6MTAwLzUpKQpgYGAKClRoZW4gaW50ZWdyYXRlIGFuZCBwbG90IHRoZSBleHBlY3RlZCBkaXN0cmlidXRpb24gZm9yIGEgZ2l2ZW4gb21lZ2EgOgoKYGBge3IgZmlnLmFzcD0wLjMsIGZpZy53aWR0aD0xMX0KZXhwZWN0ZWRfZGlzdHJpYnV0aW9uIDwtIGZ1bmN0aW9uKG4sIG9tZWdhLCBhZ2VfY29tYmluZWRfcmFuZ2UpewogIHJhbmdlX2RlbnNpdHkgPC0gYXBwcm94ZnVuKGRlbnNpdHkoYWdlX2NvbWJpbmVkX3JhbmdlW2lzLmZpbml0ZShhZ2VfY29tYmluZWRfcmFuZ2UpXSkpCiAgZyA8LSBmdW5jdGlvbih0KXtkcG9pcyhuLCBvbWVnYSp0KSpyYW5nZV9kZW5zaXR5KHQpfQogIHJldHVybiAoaW50ZWdyYXRlKGcsIGxvd2VyID0gMSwgdXBwZXIgPSBtYXgoYWdlX2NvbWJpbmVkX3JhbmdlKSkpCn0KCm9tZWdhIDwtIDAuMQoKZGVucyA8LSBzYXBwbHkoMDoyMCwgZnVuY3Rpb24obil7ZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlfSkKCnBsb3QoMDoyMCwgZGVucywgbWFpbj0iRXhwZWN0ZWQgZGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YgYWNjZXB0ZWQgbmFtZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiLCB4bGFiPSJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIiwgeWxhYiA9ICJQcm9wb3J0aW9ucyIsIHR5cGUgPSAiYiIpCmBgYAoKRmluYWxseSwgdHJ5IHRvIGZpbmQgYW4gJFxvbWVnYSQgdmFsdWUgdGhhdCBhcHByb3hpbWF0ZWx5IGZpdHMgdGhlIGZpcnN0IHBvaW50cyAodGhlIGxlYXN0IGFmZmVjdGVkIGJ5IG92ZXJzYW1wbGluZyBiaWFzZXMpIGFuZCBjaGVjayBpZiB0aGUgb3RoZXIgcG9pbnRzIGZvbGxvdyB0aGUgZXhwZWN0ZWQgY3VydmUgOgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBzYW1wbGluZwpDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjEKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsIAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIHk9IGRlbnMKICAgICptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpXSkgL21heChkZW5zKSkrCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQgPC0gQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVuc19zYW1wbGVkIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfc2FtcGxlZCksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19zYW1wbGVkIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLCAKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsCiAgICAgICAgICAgeT1hY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfc2FtcGxlZFthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkKSwgeT0gZGVuc19zYW1wbGVkCiAgICAqbWF4KGFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19zYW1wbGVkW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfc2FtcGxlZCldKSAvbWF4KGRlbnNfc2FtcGxlZCkpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgc2FtcGxpbmciKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcaW1wbGllcyQgSW5pdGlhbCBvYnNlcnZhdGlvbnMgcmVhbGx5IGRvIG5vdCBmaXQgdGhlIGV4cGVjdGF0aW9ucywgKipzcGVjaWVzIHdpdGggbW9yZSB0aGFuIDUgb2NjdXJyZW5jZXMgbXVzdCByZW1haW4gdmVyeSByYXJlKiogISBCdXQgb3VyIHN1YnNhbXBsaW5nIHNlZW1zIHRvIGNvcnJlY3QgbW9zdCBvZiB0aGlzIGJpYXMuCgpIb3dldmVyLCB0aGlzIG1ldGhvZCByZXF1aXJlcyB0byBtYWtlIHNldmVyYWwgYXJiaXRyYXJ5IGNob2ljZXMgdGhhdCBtYXkgaW50cm9kdWNlIG5ldyBiaWFzZXMgc28gd2Ugd2lsbCBpbnN0ZWFkIHN1YnNhbXBsZSBhdCBvdGhlciBsZXZlbHMgKHBhbGFlb250b2xvZ2ljYWwgY29sbGVjdGlvbiwgZ2VvbG9naWNhbCBmb3JtYXRpb24pLiBJbiBlYWNoIGNhc2Ugb25seSBvbmUgb2NjdXJyZW5jZSB3aWxsIGJlIHNhbXBsZWQgZm9yIHRoZSBzaW1pbGFybHkgaWRlbnRpZmllZCwgYSBwcm9jZXNzIHdlIHdpbGwgcmVmZXIgdG8gYXMgKiphZ2dyZWdhdGluZyoqIHRoZXNlIG9jY3VycmVuY2VzIGFjY29yZGluZyB0byB0aGUgY2hvc2VuIGZhY3Rvci4KCiMjIFN1YnNhbXBsaW5nIG9jY3VycmVuY2VzIGJ5IGFnZ3JlZ2F0aW5nIHNpbWlsYXJseSBpZGVudGlmaWVkIG9jY3VycmVuY2VzIGluIGVhY2ggY29sbGVjdGlvbgoKKipTdWJzYW1wbGluZyBieSBhZ2dyZWdhdGlvbioqID0gYWdncmVnYXRlIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgYSBnaXZlbiB0YXhvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBjcml0ZXJpdW0gKGNvbGxlY3Rpb24sIGdlb2xvZ2ljYWwgZm9ybWF0aW9uLCBjb3VudHJ5LCBnZW9sb2dpY2FsIHBsYXRlKS4KCiMjIEFnZ3JlZ2F0ZSBzaW1pbGFybHkgaWRlbnRpZmllZCBvY2N1cnJlbmNlcyBpbiBlYWNoIGNvbGxlY3Rpb24KCkluIG9yZGVyIHRvIHJlZHVjZSB0aGUgYWJ1bmRhbmNlIGJpYXMsIHdlIG1heSBrZWVwIG9ubHkgb25lIG9jY3VycmVuY2UgZm9yIGVhY2ggY29sbGVjdGlvbiA6CgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGNvbGxlY3Rpb25zCmNvbGxlY3Rpb25zIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm8pKQpmb3IgKGNvbGwgaW4gY29sbGVjdGlvbnMpewogIENldGFjZWFfb2NjX2NvbGwgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubz09Y29sbCxdCiAgCiAgIyBCcm93c2UgYWxsIGFjY2VwdGVkIG5hbWVzIGluIGVhY2ggY29sbGVjdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfY29sbCRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19jb2xsW0NldGFjZWFfb2NjX2NvbGwkYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCiRcdG8kIE5vdCBlbm91Z2ggb2NjdXJyZW5jZXMgYXJlIHJlbW92ZWQgdG8gbWFrZSBhIHN1ZmZpY2llbnQgZGlmZmVyZW5jZS4gSWYgd2UgbG9vayBhdCB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBvY2N1cnJlbmNlcyA6CgpgYGB7cn0KY29sbGVjdGlvbl9tYXhfb2NjdXJyZW5jZXMgPC0gbWF4KHRhYmxlKENldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm8pW0NldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm9dKQpjb2xsZWN0aW9uX21heF9ubyA8LSBuYW1lcyh0YWJsZShDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKVtDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vXVt0YWJsZShDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKVtDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vXT09Y29sbGVjdGlvbl9tYXhfb2NjdXJyZW5jZXNdWzFdKQoKdGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vPT1jb2xsZWN0aW9uX21heF9ubyxdJGFjY2VwdGVkX25hbWUpKQpgYGAKCiRcdG8kIFRoZXJlIGFyZSB2ZXJ5IGZldyByZWR1bmRhbmNpZXMgYW1vbmcgdGhlIGFjY2VwdGVkIG5hbWVzIGluIGNvbGxlY3Rpb25zIHNvIGFnZ3JlZ2F0aW5nIHRob3NlIHdvbid0IHJlZHVjZSB0aGUgYWJ1bmRhbmNlIGJpYXMuCgpJbnN0ZWFkLCB3ZSBtYXkgdHJ5IHRvICoqYWdncmVnYXRlIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZSBhdCB0aGUgbGV2ZWwgb2YgdGhlIGdlb2xvZ2ljYWwgZm9ybWF0aW9uKiogKGllIHN1YnNhbXBsZSBvbmx5IG9uZSBmb3IgZWFjaCkuCgojIyBBZ2dyZWdhdGUgc2ltaWxhcmx5IGlkZW50aWZpZWQgb2NjdXJyZW5jZXMgaW4gZWFjaCBmb3JtYXRpb24KCmBgYHtyIGZpZy5oZWlnaHQ9OCwgaW5jbHVkZT1GfQpDZXRhY2VhX29jY19zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdCgojIEJyb3dzZSBhbGwgbnVtYmVycyBvZiBvY2N1cnJlbmNlcyBieSBmb3JtYXRpb24KZm9ybWF0aW9uX29jY3VycmVuY2VzX25iIDwtIGFzLm51bWVyaWMobmFtZXModGFibGUodGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbikpKSkpCgpmb3IgKG4gaW4gbGlzdChjKDQsIDcpLCBjKDgsIDE1KSwgYygxNiwgMTI0KSkpewogIEEgPC0gQ2V0YWNlYV9vY2Nfc3BlY2llc1thcy5sb2dpY2FsKHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKVtDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbl0+PW5bMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXMubG9naWNhbCh0YWJsZShDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbilbQ2V0YWNlYV9vY2Nfc3BlY2llcyRmb3JtYXRpb25dPD1uWzJdKSxdCiAgQSRmb3JtYXRpb24gPC0gZHJvcGxldmVscyhBJGZvcm1hdGlvbikKCiAgcCA8LSBnZ3Bsb3QoQSwgYWVzKHg9LWFnZV9tZWFuLCBmaWxsPWFjY2VwdGVkX25hbWUpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgY29sPSJibGFjayIpICsKICAgIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgZm9ybWF0aW9uIikgKwogICAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIikgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIG1lYW4gYWdlIGZvciBmb3JtYXRpb25zIHdpdGgiLCBuWzFdLCAiLSIsIG5bMl0sICJvY2N1cnJlbmNlcyAoY29sb3JlZCBieSBzcGVjaWVzKSIpKSArCiAgICBmYWNldF9ncmlkKGZvcm1hdGlvbiB+IC4sIHNjYWxlcz0iZnJlZSIpCiAgcHJpbnQocCkKfQoKbWF4X3NwZWNpZXNfYnlfZm9ybWF0aW9uIDwtIG1heCh0YWJsZShDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbikpCkEgPC0gQ2V0YWNlYV9vY2Nfc3BlY2llc1thcy5sb2dpY2FsKHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKVtDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbl09PW1heF9zcGVjaWVzX2J5X2Zvcm1hdGlvbiksXQpBJGZvcm1hdGlvbiA8LSBkcm9wbGV2ZWxzKEEkZm9ybWF0aW9uKQoKZ2dwbG90KEEsIGFlcyh4PS1hZ2VfbWVhbiwgZmlsbD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbikpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGNvbD0iYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgZm9ybWF0aW9uIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgbmFtZSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzJyBtZWFuIGFnZSBmb3IiLCBtYXhfc3BlY2llc19ieV9mb3JtYXRpb24sICJvY2N1cnJlbmNlcyB3aXRob3V0IGluZGljYXRlZCBmb3JtYXRpb24gKGNvbG9yZWQgYnkgc3BlY2llcykiKSkgKwogIGZhY2V0X2dyaWQoZm9ybWF0aW9uIH4gLikKCiMgJFx0byQgRm9yIG1vc3QgZm9ybWF0aW9ucyBlYWNoIHNwZWNpZXMgc2VlbXMgdG8gYmUgcmVzdHJpY3RlZCB0byBvbmx5IG9uZSBhZ2UsIHNvIGFzIGV4cGVjdGVkIHdlIGFyZSBub3QgbG9vc2luZyB0b28gbXVjaCBpbmZvcm1hdGlvbiB3aGVuIGFnZ3JlZ2F0aW5nIHRoZW0gdG8gYSBzaW5nbGUgb2NjdXJyZW5jZS4KYGBgCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGZvcm1hdGlvbnMKZm9ybWF0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRmb3JtYXRpb24pKQpmb3IgKGZvcm0gaW4gZm9ybWF0aW9ucyl7CiAgQ2V0YWNlYV9vY2NfZm9ybSA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PWZvcm0sXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCiRcdG8kIEluIHRoYXQgY2FzZSB0aGUgc3ViLXNhbXBsaW5nIGlzIGJpZyBlbm91Z2ggdG8gaG9wZSBjb3JyZWN0aW5nIG91ciBiaWFzLgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjEKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgeT0gZGVuc19hZ2dyZWcKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpXSkgL21heChkZW5zX2FnZ3JlZykpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCmBgYAoKJFx0byQgVGhlIGluaXRpYWwgYmlhcyBpcyBtb3N0bHkgY29ycmVjdGVkLgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNSwgbWVzc2FnZT1GfQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD1OQSwgY29sPSJyZWQiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMiA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJibHVlIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSBvciBhZ2dyZWdhdGluZyBpbiBmb3JtYXRpb25zIChncmVlbikiKQpgYGAKCiRcdG8kIENvbXBhcmluZyB3aXRoIHRoZSBpbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiBhbmQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFmdGVyIG91ciBmaXJzdCBzdWItc2FtcGxpbmcgaXQgYXBwZWFycyB0aGF0IGJvdGggbWV0aG9kcyBsZWFkIHRvIHZlcnkgc2ltaWxhciBkaXN0cmlidXRpb25zLiBUaGlzIGNvbmZvcnRzIHVzIGFib3V0IHRoZSByb2J1c3RuZXNzIG9mIHRob3NlIGFwcHJvYWNoZXMuCgpIb3dldmVyLCB3ZSBoYXZlIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBvY2N1cnJlbmNlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBpbmRpY2F0ZWQgZ2VvbG9naWNhbCBmb3JtYXRpb24gdG8gc3Vic2FtcGxlIHRoZW0gc2VwYXJhdGVseS4KCiMjIEFnZ3JlZ2F0ZSBvY2N1cnJlbmNlcyB3aXRob3V0IGZvcm1hdGlvbiBieSBjb3VudHJ5ICsgZWFybHkgaW50ZXJ2YWwKClRvIGFwcHJveGltYXRlIGdlb2xvZ2ljYWwgZm9ybWF0aW9uIHdlIGNob3NlIHRvIHByb2NlZWQgdG8gdGhlIGFnZ3JlZ2F0aW9uIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgY291bnRyeSBhbmQgdGhlIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWwuCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGNvdW50cmllcwpjb3VudHJpZXMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIixdJGNjKSkKZm9yIChjb3VudHJ5IGluIGNvdW50cmllcyl7CiAgQ2V0YWNlYV9vY2NfY2MgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIiAmIENldGFjZWFfb2NjJGNjPT1jb3VudHJ5LF0KICAKICAjIEJyb3dzZSBhbGwgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbHMKICBlYXJseV9pbnRlcnZhbHMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfY2MkZWFybHlfaW50ZXJ2YWwpKQogIGZvciAoZWkgaW4gZWFybHlfaW50ZXJ2YWxzKXsKICAgIENldGFjZWFfb2NjX2NjX2VpIDwtIENldGFjZWFfb2NjX2NjW0NldGFjZWFfb2NjX2NjJGVhcmx5X2ludGVydmFsPT1laSxdCiAgICAKICAgICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGNvdW50cnkgJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICAgIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfY2NfZWkkYWNjZXB0ZWRfbmFtZSkpCiAgICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfbihDZXRhY2VhX29jY19jY19laVtDZXRhY2VhX29jY19jY19laSRhY2NlcHRlZF9uYW1lPT1uYW1lLF0sIHNpemUgPSAxKSkKICAgIH0KICB9Cn0KCiMgQnJvd3NlIGFsbCBmb3JtYXRpb25zCmZvcm1hdGlvbnMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2MkZm9ybWF0aW9uKSkKZm9yIChmb3JtIGluIGZvcm1hdGlvbnNbLXdoaWNoKGZvcm1hdGlvbnM9PSIiKV0pewogIENldGFjZWFfb2NjX2Zvcm0gPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT1mb3JtLF0KICAKICAjIEJyb3dzZSBhbGwgYWNjZXB0ZWQgbmFtZXMgaW4gZWFjaCBmb3JtYXRpb24gJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZSkpCiAgZm9yIChuYW1lIGluIHRheGEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywgc2FtcGxlX24oQ2V0YWNlYV9vY2NfZm9ybVtDZXRhY2VhX29jY19mb3JtJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogIH0KfQoKZGF0YS5mcmFtZShDZXRhY2VhX29jYyA9IGMoZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgb25seSkiKSkKYGBgCgpNb3JlIG9jY3VycmVuY2VzIHJlbWFpbiBhZnRlciBhZ2dyZWdhdGluZyB3aXRoIHRoaXMgbmV3IG1ldGhvZC4gTGV0J3MgY29tcGFyZSBhZ2FpbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb24gOgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNH0KIyBSZWNvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpvbWVnYSA8LSAwLjE1CmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnMgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIGZ1bmN0aW9uKG4peyBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBpbml0aWFsIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sIAogICAgICAgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwgCiAgICAgICAgICAgeT1hY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgeT0gZGVucwogICAgKm1heCgodGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyldKSAvbWF4KGRlbnMpKSsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGNvcnJlY3RlZCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sIAogICAgICAgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudCwKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWdbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIHk9IGRlbnNfYWdncmVnCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkpW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKV0pIC9tYXgoZGVuc19hZ2dyZWcpKSArCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGZvcm1hdGlvbnMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyA8LSBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVuc19hZ2dyZWcgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwpgYGAKCiRcdG8kIFRoZSBjb3JyZXNwb25kYW5jZSBpcyBzdGlsbCBnb29kLCBleGNlcHQgZm9yIHR3byB0YXhhIDoKCmBgYHtyfQp0YWJsZShkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF1bYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZz4xMCxdJGFjY2VwdGVkX25hbWUpKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpDZXRhY2VhX29jY19hZ2dyZWckYWdlX3JhbmdlIDwtIENldGFjZWFfb2NjX2FnZ3JlZyRtYXhfbWEtQ2V0YWNlYV9vY2NfYWdncmVnJG1pbl9tYQpDZXRhY2VhX29jY19hZ2dyZWckbWluX21pbl9tYSA8LSBhcHBseShDZXRhY2VhX29jY19hZ2dyZWcsIDEsIGZ1bmN0aW9uKFgpe21pbihDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV9yYW5nZTwxMCAmIENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lPT1YWyJhY2NlcHRlZF9uYW1lIl0sXSRtaW5fbWEpfSkKQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYXhfbWEgPC0gYXBwbHkoQ2V0YWNlYV9vY2NfYWdncmVnLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfcmFuZ2U8MTAgJiBDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdLF0kbWF4X21hKX0pCkNldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfY29tYmluZWRfbWVhbiA8LSAoQ2V0YWNlYV9vY2NfYWdncmVnJG1pbl9taW5fbWEgKyBDZXRhY2VhX29jY19hZ2dyZWckbWF4X21heF9tYSkvMgpDZXRhY2VhX29jY19hZ2dyZWckYWdlX2NvbWJpbmVkX3JhbmdlIDwtIENldGFjZWFfb2NjX2FnZ3JlZyRtYXhfbWF4X21hLUNldGFjZWFfb2NjX2FnZ3JlZyRtaW5fbWluX21hCkNldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUpW3hdfSkKQ2V0YWNlYV9vY2NfYWdncmVnJG9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSA8LSBDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZV9jb3VudC9DZXRhY2VhX29jY19hZ2dyZWckYWdlX2NvbWJpbmVkX3JhbmdlCmBgYAoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRX0KYnJlYWtzIDwtIGMoMC4xMjUsMC4yNSwwLjUsMSwyLDQsOCwxNikKCnBfYmVmb3JlIDwtIGdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9b2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0wLjUsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKG5hbWUgPSAiU3BlY2llcyIpICsKICBsYWJzKGNvbG91cj0iT2NjdXJyZW5jZVxuZGVuc2l0eSIpICsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1icmVha3MsIGxhYmVscz1icmVha3MpICsgCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9ucyBvZiBzcGVjaWVzIGZvc3NpbCBhZ2UgcmFuZ2VzLCBiZWZvcmUgc3Vic2FtcGxpbmcgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdKVsxXSwgIikiLCBzZXA9IiIpKQpwX2JlZm9yZQoKZ2dzYXZlKCIuLi9JbWFnZXMvUmFuZ2VfZGlzdHJpYnV0aW9uc19iZWZvcmVfYWdncmVnYXRpbmcuc3ZnIiwgcGxvdCA9IHBfYmVmb3JlLCBkZXZpY2UgPSAic3ZnIiwgYmcgPSAidHJhbnNwYXJlbnQiKQoKcF9hZnRlciA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHJhbmdlcywgYWZ0ZXIgc3Vic2FtcGxpbmcgYnkgYWdncmVnYXRpb24gKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2Nfc2FtcGxlZClbMV0sICIpIiwgc2VwPSIiKSkKcF9hZnRlcgoKZ2dzYXZlKCIuLi9JbWFnZXMvUmFuZ2VfZGlzdHJpYnV0aW9uc19hZnRlcl9hZ2dyZWdhdGluZy5zdmciLCBwbG90ID0gcF9hZnRlciwgZGV2aWNlID0gInN2ZyIsIGJnID0gInRyYW5zcGFyZW50IikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC41fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD1OQSwgY29sPSJyZWQiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMiA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJibHVlIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikKCnBfYWxsIDwtIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSBvciBhZ2dyZWdhdGluZyBpbiBmb3JtYXRpb25zIChncmVlbikiKSArIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpCnBfYWxsCgpnZ3NhdmUoIi4uL0ltYWdlcy9PY2N1cnJlbmNlX2Rpc3RyaWJ1dGlvbnNfY29tcGFyaXNvbi5zdmciLCBwbG90ID0gcF9hbGwsIGRldmljZSA9ICJzdmciLCBiZyA9ICJ0cmFuc3BhcmVudCIpCmBgYAoKJFx0byQgQ29tcGFyaW5nIHdpdGggdGhlIGluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIGFuZCB3aXRoIHRoZSBkaXN0cmlidXRpb24gYWZ0ZXIgb3VyIGZpcnN0IHN1Yi1zYW1wbGluZyBpdCBhcHBlYXJzIHRoYXQgYm90aCBtZXRob2RzIGxlYWQgdG8gdmVyeSBzaW1pbGFyIGRpc3RyaWJ1dGlvbnMuIFRoaXMgY29uZm9ydHMgdXMgYWJvdXQgdGhlIHJvYnVzdG5lc3Mgb2YgdGhvc2UgYXBwcm9hY2hlcy4KClJlcGxhY2luZyBjb3V0cmllcyBieSBnZWxvZ2ljYWwgcGxhdGVzIHNlZW1zIHRvIG1ha2UgbW9yZSBzZW5zIGZyb20gYSBwYWxhZW9udG9sb2dpY2FsIHBlcnNwZWN0aXZlLCBzbyBsZXQncyB0cnkgaXQuCgojIyBBZ2dyZWdhdGUgb2NjdXJyZW5jZXMgd2l0aG91dCBmb3JtYXRpb24gYnkgZ2VvcGxhdGUgKyBlYXJseSBpbnRlcnZhbAoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZyA8LSBjKCkKCiMgQnJvd3NlIGFsbCBnZW9wbGF0ZXMKZ2VvcGxhdGVzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09IiIsXSRnZW9wbGF0ZSkpCmZvciAoZ3AgaW4gZ2VvcGxhdGVzKXsKICBDZXRhY2VhX29jY19ncCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiICYgQ2V0YWNlYV9vY2MkZ2VvcGxhdGU9PWdwLF0KICAKICAjIEJyb3dzZSBhbGwgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbHMKICBlYXJseV9pbnRlcnZhbHMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3AkZWFybHlfaW50ZXJ2YWwpKQogIGZvciAoZWkgaW4gZWFybHlfaW50ZXJ2YWxzKXsKICAgIENldGFjZWFfb2NjX2dwX2VpIDwtIENldGFjZWFfb2NjX2dwW0NldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsPT1laSxdCiAgICAKICAgICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogICAgdGF4YSA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY19ncF9laSRhY2NlcHRlZF9uYW1lKSkKICAgIGZvciAobmFtZSBpbiB0YXhhKXsKICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9uKENldGFjZWFfb2NjX2dwX2VpW0NldGFjZWFfb2NjX2dwX2VpJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogICAgfQogIH0KfQoKIyBCcm93c2UgYWxsIGZvcm1hdGlvbnMKZm9ybWF0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRmb3JtYXRpb24pKQpmb3IgKGZvcm0gaW4gZm9ybWF0aW9uc1std2hpY2goZm9ybWF0aW9ucz09IiIpXSl7CiAgQ2V0YWNlYV9vY2NfZm9ybSA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PWZvcm0sXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCk1vcmUgb2NjdXJyZW5jZXMgcmVtYWluIGFmdGVyIGFnZ3JlZ2F0aW5nIHdpdGggdGhpcyBuZXcgbWV0aG9kLiBMZXQncyBjb21wYXJlIGFnYWluIHdpdGggdGhlIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbiA6CgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC40fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYWZ0ZXIgdGhlIGFnZ3JlZ2F0aW9uCkNldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUpW3hdfSkKCm9tZWdhIDwtIDAuMTUKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgeT0gZGVuc19hZ2dyZWcKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpXSkgL21heChkZW5zX2FnZ3JlZykpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKYGBgCgokXHRvJCBUaGUgY29ycmVzcG9uZGFuY2UgaXMgc3RpbGwgZ29vZCwgZXhjZXB0IGZvciB0d28gdGF4YSA6CgpgYGB7cn0KdGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdW2FjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWc+MTAsXSRhY2NlcHRlZF9uYW1lKSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC41fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD1OQSwgY29sPSJyZWQiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMiA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJibHVlIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIChncmVlbikiKQoKcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAyKSkgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAzKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBzdWItc2FtcGxpbmcgKGJsdWUpIG9yIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyAoZ3JlZW4pIikKYGBgCgokXHRvJCBEZWxpbWl0aW5nIGJ5IGdlb2xvZ2ljYWwgcGxhdGVzICgrIGFnZSkgaW5zdGVhZCBvZiBjb3VudHJpZXMgKCsgYWdlKSBsZWFkcyB0byBzaW1pbGFyIGRpc3RyaWJ1dGlvbnMsIHNvIHdlIHdpbGwga2VlcCBpdC4KCiMjIENoZWNrIHRoYXQgdGhlIHNhbXBsaW5nIG1ldGhvZHMgZG8gbm90IGludHJvZHVjZSBiaWFzZXMgaW4gdGhlIHJlcGFydGl0aW9uIGJldHdlZW4gT2RvbnRvY2V0aSBhbmQgTXlzdGljZXRpCgpNeXN0ZWNldGVzIGFyZSB1c3VhbGx5IGxhcmdlciB0aGFuIG9kb250b2NldGVzLCBhbmQgc2l6ZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB3aWRlciBnZW9ncmFwaGljIHJhbmdlIHNvIHNpbmNlIHdlIGFyZSBzdWJzYW1wbGluZyBvY2N1cnJlbmNlcyBhY2NvcmRpbmcgdG8gZ2VvbG9naWNhbCBmb3JtYXRpb24gd2UgbWF5IGJlIGJpYXNpbmcgb3VyIGRhdGEgdG93YXJkcyBtb3JlIHdpZGVzcHJlYWQgc3BlY2llcywgdGhlcmVmb3JlIHRvd2FyZHMgbXlzdGVjZXRlcy4KCkxvb2sgYXQgdGhlIGZhbWlsaWVzIGZpcnN0IDoKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KZmFtaWxpZXMgPC0gcmJpbmQoQ2V0YWNlYV9vY2MgPSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwKICAgICAgICAgICAgICAgICAgQ2V0YWNlYV9vY2Nfc2FtcGxlZCA9IENldGFjZWFfb2NjX3NhbXBsZWQsCiAgICAgICAgICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0pICU+JQogICAgICAgICAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiRGF0YXNldCIpCgpmYW1pbGllcyA8LSBmYW1pbGllc1ssYygiRGF0YXNldCIsICJmYW1pbHkiKV0KZmFtaWxpZXMkRGF0YXNldCA8LSBzYXBwbHkoZmFtaWxpZXMkRGF0YXNldCwgZ3N1YiwgcGF0dGVybj0iXFwuLioiLCByZXBsYWNlbWVudD0iIikKCmdncGxvdChmYW1pbGllc1tmYW1pbGllcyRmYW1pbHkgIT0gIk5PX0ZBTUlMWV9TUEVDSUZJRUQiLF0sIGFlcyh4ID0gRGF0YXNldCwgZmlsbCA9IGZhbWlseSkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIGNvbD0iYmxhY2siKQpgYGAKCiRcdG8kIFRoZSBmYW1pbHkgcmVwYXJ0aXRpb25zIHZhcnkgYSBiaXQgYWZ0ZXIgc3Vic2FtcGxpbmcsIGJ1dCBiZWNhdXNlIG9mIHRoZSBsaW1pdGVkIG51bWJlciBvZiBzcGVjaWVzIGJ5IGZhbWlseSB0aGUgZmFjdCB0aGF0IHdlIGNvcnJlY3RlZCB0aGUgb3ZlcnNhbXBsaW5nIG9mIHNvbWUgc3BlY2llcyBjb3VsZCBoYXZlIGEgZGlzcHJvcG9ydGlvbmF0ZSBlZmZlY3QuCgpMZXQncyBsb29rIHJhdGhlciBhdCBhIGhpZ2hlciB0YXhvbm9taWMgcmFuaywgYnkgaW1wb3J0aW5nIHRoZSB0b3BvbG9neSBvZiBjZXRhY2VhbiBmYW1pbGllcyAoZnJvbSBNYXJ4IGV0IGFsLiAyMDE2KSA6CgpgYGB7ciBmaWcud2lkdGg9MTAsIGluY2x1ZGU9Rn0KZmFtaWxpZXNfdHJlZSA8LSBhcGU6OnJlYWQudHJlZSgiLi4vYmpvZWxsZS1zdHJhdGlncmFwaGljX2FnZV91bmNlcnRhaW50eV9TSS05YmJjZWYyL2NldGFjZWFuc19kYXRhL2Zvc3NpbHMvZmFtaWxpZXMudHJlIikKZ2d0cmVlKGZhbWlsaWVzX3RyZWUpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIGNldGFjZWFuIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgOCkKCmZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX2F0X25vZGUoZmFtaWxpZXNfdHJlZSwgIk9kb250b2NldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX09kb250b2NldGkpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIG9kb250b2NldGUgZmFtaWxpZXMiKSArCiAgeGxpbSgwLCA1KQoKZmFtaWxpZXNfdHJlZV9NeXN0aWNldGkgPC0gY2FzdG9yOjpnZXRfc3VidHJlZV9hdF9ub2RlKGZhbWlsaWVzX3RyZWUsICJNeXN0aWNldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX015c3RpY2V0aSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgbXlzdGljZXRlIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgNSkKCmZhbWlsaWVzX3RyZWVfU3RlbSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX3dpdGhfdGlwcyhmYW1pbGllc190cmVlLCBvbWl0X3RpcHMgPSBjKGZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSR0aXAubGFiZWwsIGZhbWlsaWVzX3RyZWVfTXlzdGljZXRpJHRpcC5sYWJlbCkpJHN1YnRyZWUKZ2d0cmVlKGZhbWlsaWVzX3RyZWVfU3RlbSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgYXJjaGVvY2V0ZSBmYW1pbGllcyIpICsKICB4bGltKDAsIDMpCmBgYAoKYGBge3IsIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9OH0KT2RvbnRvY2V0aV9mYW1pbGllcyA8LSBjKGZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aVtjKCJ0aXAubGFiZWwiLCAibm9kZS5sYWJlbCIpXSwgIktlbnRyaW9kb250aWRhZSIsICJTcXVhbG96aXBoaWlkYWUiKQpNeXN0aWNldGlfZmFtaWxpZXMgPC0gZmFtaWxpZXNfdHJlZV9NeXN0aWNldGlbYygidGlwLmxhYmVsIiwgIm5vZGUubGFiZWwiKV0KYXJjaGFlb2NldGVfZmFtaWxpZXMgPC0gZmFtaWxpZXNfdHJlZV9TdGVtW2MoInRpcC5sYWJlbCIsICJub2RlLmxhYmVsIildCgpmYW1pbHlfdG9fdGF4b25vbWljX2dyb3VwIDwtIGZ1bmN0aW9uKGZhbWlseSl7CiAgcmV0dXJuKGMoIk9kb250b2NldGkiLCAiTXlzdGljZXRpIiwgImFyY2hhZW9jZXRlcyIpWwogICAgZ3JlcChwYXR0ZXJuID0gZmFtaWx5LAogICAgICAgICB4ID0gbGlzdChPZG9udG9jZXRpX2ZhbWlsaWVzLCBNeXN0aWNldGlfZmFtaWxpZXMsIGFyY2hhZW9jZXRlX2ZhbWlsaWVzKSldKQogIH0KCmZhbWlsaWVzJFRheG9ub21pYy5ncm91cCA8LSBhcy5jaGFyYWN0ZXIoc2FwcGx5KGZhbWlsaWVzJGZhbWlseSwgZmFtaWx5X3RvX3RheG9ub21pY19ncm91cCkpCmdncGxvdChmYW1pbGllc1tmYW1pbGllcyRmYW1pbHkgIT0gIk5PX0ZBTUlMWV9TUEVDSUZJRUQiLF0sIGFlcyh4ID0gRGF0YXNldCwgZmlsbCA9IFRheG9ub21pYy5ncm91cCkpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIGNvbD0iYmxhY2siKQoKZ2dwbG90KGZhbWlsaWVzW2ZhbWlsaWVzJGZhbWlseSAhPSAiTk9fRkFNSUxZX1NQRUNJRklFRCIgJiBmYW1pbGllcyRUYXhvbm9taWMuZ3JvdXAgIT0gImFyY2hhZW9jZXRlcyIsXSwgYWVzKHggPSBEYXRhc2V0LCBmaWxsID0gVGF4b25vbWljLmdyb3VwKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgY29sPSJibGFjayIpCmBgYAoKJFx0byQgVGhlcmUgaXMgYSBzbWFsbGVyIHByb3BvcnRpb24gb2YgYXJjaGVvY2V0ZSBvY2N1cnJlbmNlcyBhZnRlciBlaXRoZXIgc2FtcGxpbmcsIGJlY2F1c2UgYSBodWdlIGNsdXN0ZXIgaXMgc3Vic2FtcGxlZCBhcm91bmQgMzUgTXkgYWdvLCBidXQgdGhpcyBlZmZlY3QgaXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIGZvciB0aGUgTXlzdGljZXRpIHZzLiBPZG90b2NldGkgdGhlcmUgaXMgbm8gaHVnZSBhcHBhcmVudCBiaWFzLCBlc3BlY2lhbGx5IHdpdGggdGhlIGFnZ3JlZ2F0aW5nIG1ldGhvZC4KCmBgYHtyfQojIHdyaXRlKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdJGFnZV9ydW5pZiwgCiMgICAgICAgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2FnZV9ydW5pZl9hZ2Vfc3BlY2llc19jb3JyZWN0ZWQuY3N2IiwgCiMgICAgICAgc2VwID0gIjsgIiwgCiMgICAgICAgbmNvbHVtbnMgPSBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKQp3cml0ZS50YWJsZShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0gInNwZWNpZXMiLCBjKCJtaW5fbWEiLCAibWF4X21hIildLAogICAgICAgICAgICBmaWxlPSIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX29jY3VycmVuY2VzX21pbl9tYXhfYWdlX3NwZWNpZXNfY29ycmVjdGVkLmNzdiIsIHNlcD0iLCIsIHJvdy5uYW1lcz1GQUxTRSwgY29sLm5hbWVzPUZBTFNFKQoKd3JpdGUudGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLCBjKCJtaW5fbWEiLCAibWF4X21hIildLAogICAgICAgICAgICBmaWxlPSIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX29jY3VycmVuY2VzX21pbl9tYXhfYWdlX3NwZWNpZXNfZ2VuZXJhX2NvcnJlY3RlZC5jc3YiLCBzZXA9IiwiLCByb3cubmFtZXM9RkFMU0UsIGNvbC5uYW1lcz1GQUxTRSkKYGBgCgpgYGB7ciBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09ICJzcGVjaWVzIixdLCBhZXMoeD0tYWdlX3J1bmlmLCB5PXJub3JtKGxlbmd0aChhZ2VfcnVuaWYpLCAxLCAwLjAzKSkpICsKICBnZW9tX3BvaW50KGNleD0xLjUsIGFscGhhPTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJSZXBhcnRpdGlvbiBvZiIsIGRpbShjZXRhY2VhX3BiZGIpWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIikpCmBgYAoKIyBGYXN0ZXIgZ2VudXMtbGV2ZWwgYW5hbHlzaXMKCkFwcGx5IHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9ucyBhdCB0aGUgZ2VuZXJpYyBsZXZlbCB0byBwZXJmb3JtIHRoZSBhbmFseXNpcyBmYXN0ZXIuCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA8LSBjKCkKCiMgQnJvd3NlIGFsbCBmb3JtYXRpb25zCmZvcm1hdGlvbnMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2MkZm9ybWF0aW9uKSkKZm9yIChmb3JtIGluIGZvcm1hdGlvbnNbLXdoaWNoKGZvcm1hdGlvbnM9PSIiKV0pewogIENldGFjZWFfb2NjX2Zvcm0gPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT1mb3JtLF0KICAKICAjIEJyb3dzZSBhbGwgZ2VuZXJhIGluIGVhY2ggZm9ybWF0aW9uICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgZ2VuZXJhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2Zvcm0kZ2VudXMpKQogIGZvciAoZ2VuIGluIGdlbmVyYSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4sIHNhbXBsZV9uKENldGFjZWFfb2NjX2Zvcm1bQ2V0YWNlYV9vY2NfZm9ybSRnZW51cz09Z2VuLF0sIHNpemUgPSAxKSkKICB9Cn0KCiMgQnJvd3NlIGFsbCBnZW9wbGF0ZXMKZ2VvcGxhdGVzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09IiIsXSRnZW9wbGF0ZSkpCmZvciAoZ3AgaW4gZ2VvcGxhdGVzKXsKICBDZXRhY2VhX29jY19ncCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiICYgQ2V0YWNlYV9vY2MkZ2VvcGxhdGU9PWdwLF0KICAKICAjIEJyb3dzZSBhbGwgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbHMKICBlYXJseV9pbnRlcnZhbHMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3AkZWFybHlfaW50ZXJ2YWwpKQogIGZvciAoZWkgaW4gZWFybHlfaW50ZXJ2YWxzKXsKICAgIENldGFjZWFfb2NjX2dwX2VpIDwtIENldGFjZWFfb2NjX2dwW0NldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsPT1laSxdCiAgICAKICAgICMgQnJvd3NlIGFsbCBnZW5lcmEgJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICAgIGdlbmVyYSA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY19ncF9laSRnZW51cykpCiAgICBmb3IgKGdlbiBpbiBnZW5lcmEpewogICAgICBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfbihDZXRhY2VhX29jY19ncF9laVtDZXRhY2VhX29jY19ncF9laSRnZW51cz09Z2VuLF0sIHNpemUgPSAxKSkKICAgIH0KICB9Cn0KCmRhdGEuZnJhbWUoQ2V0YWNlYV9vY2MgPSBjKGRpbShDZXRhY2VhX29jYylbMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4pWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdKVsxXS1kaW0oQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgYW5kIGdlbmVyYSBvbmx5KSIpKQpgYGAKCk1vcmUgb2NjdXJyZW5jZXMgcmVtYWluIGFmdGVyIGFnZ3JlZ2F0aW5nIHdpdGggdGhpcyBuZXcgbWV0aG9kLiBMZXQncyBjb21wYXJlIGFnYWluIHdpdGggdGhlIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbiA6CgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC40fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGdlbnVzIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jYyRnZW51c19jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2MkZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjJGdlbnVzKVt4XX0pCkNldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXNfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMpW3hdfSkKCm9tZWdhIDwtIDAuMwpnZW51c19jb3VudCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kZ2VudXNfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoZ2VudXNfY291bnQpLCBmdW5jdGlvbihuKXsgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQpnZW51c19jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGdlbnVzX2NvdW50KS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGdlbnVzX2NvdW50KSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGdlbnVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIAogICAgICAgYWVzKHg9Z2VudXNfY291bnQsIAogICAgICAgICAgIHk9Z2VudXNfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoZ2VudXNfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoZ2VudXNfY291bnQpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShnZW51c19jb3VudCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudCkpKSlbYXMuZmFjdG9yKGdlbnVzX2NvdW50KV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBnZW51cyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGdlbmVyYSAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKQoKZ2VudXNfY291bnRfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kZ2VudXNfY291bnQKZGVuc19hZ2dyZWcgPC0gc2FwcGx5KDE6bWF4KGdlbnVzX2NvdW50X2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQoKIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBnZW51cwpnZW51c19jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoZ2VudXNfY291bnRfYWdncmVnKSkpCgojIE51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBjYXRlZ29yeQpDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGdlbnVzX2NhdGVnb3JpZXNfY291bnQgPC0gYXMubnVtZXJpYyhnZW51c19jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRnZW51c19jb3VudCldKQoKIyBDb21wYXJlIHRoZSBjb3JyZWN0ZWQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdLCAKICAgICAgIGFlcyh4PWdlbnVzX2NvdW50LAogICAgICAgICAgIHk9Z2VudXNfY2F0ZWdvcmllc19jb3VudCwKICAgICAgICAgICBzaXplPWdlbnVzX2NhdGVnb3JpZXNfY291bnQpKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChnZW51c19jb3VudF9hZ2dyZWcpLCB5PSBkZW5zX2FnZ3JlZwogICAgKm1heCgodGFibGUoZ2VudXNfY291bnRfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykpKSlbYXMuZmFjdG9yKGdlbnVzX2NvdW50X2FnZ3JlZyldKSAvbWF4KGRlbnNfYWdncmVnKSkgKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBnZW51cyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGdlbmVyYSAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyIpCgpnZW51c19jb3VudF9hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSRnZW51c19jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoZ2VudXNfY291bnRfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmdlbnVzX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZ2VudXMKYGBgCgokXHRvJCBUaGUgY29ycmVzcG9uZGFuY2UgaXMgbXVjaCBsZXNzIGltcHJvdmVkIHRoYW4gd2l0aCBzcGVjaWVzIGFnZ3JlZ2F0aW9uIGJlY2F1c2Ugc29tZSBnZW5lcmEgaGF2ZSBhIGxvdCBvZiBvY2N1cnJlbmNlcyBkdWUgdG8gdGhlaXIgaGlnaCBudW1iZXIgb2Ygc3BlY2llcyBzcGVjaWVzIDoKCmBgYHtyfQp0YWJsZShkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSkgJiAoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRnZW51c19jb3VudD4yNSksXSRnZW51cykpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuNX0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCAxMDApICsKICB0aGVtZV92b2lkKCkKCnAyIDwtIGdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImJsdWUiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDEwMCkgKwogIHRoZW1lX3ZvaWQoKQoKcDMgPC0gZ2dwbG90KENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iZ3JlZW4iKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDEwMCkgKwogIHRoZW1lX3ZvaWQoKQoKIyBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQojIAojIHAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMykpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIChncmVlbikiKQoKcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAzKSkgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAyKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBzdWItc2FtcGxpbmcgKGJsdWUpIG9yIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyAoZ3JlZW4pIikKYGBgCgokXHRvJCBEZWxpbWl0aW5nIGJ5IGdlb2xvZ2ljYWwgcGxhdGVzICgrIGFnZSkgaW5zdGVhZCBvZiBjb3VudHJpZXMgKCsgYWdlKSBsZWFkcyB0byBzaW1pbGFyIGRpc3RyaWJ1dGlvbnMsIHdpdGggYSBiaXQgbW9yZSBvY2N1cnJlbmNlcy4KCmBgYHtyfQp3cml0ZS50YWJsZShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSwgYygibWluX21hIiwgIm1heF9tYSIpXSwKICAgICAgICAgICAgZmlsZT0iLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9vY2N1cnJlbmNlc19taW5fbWF4X2FnZV9nZW5lcmFfY29ycmVjdGVkLmNzdiIsIHNlcD0iLCIsIHJvdy5uYW1lcz1GQUxTRSwgY29sLm5hbWVzPUZBTFNFKQpgYGAKCiMgQ29uY2x1c2lvbnMKCiAgLSBJdCBzZWVtcyBwb3NzaWJsZSB0byBhZGVxdWF0ZWx5IHJlZHVjZSB0aGUgYWJ1bmRhbmNlIGJpYXMgYnkgc3Vic2FtcGxpbmcgdGhlIG1vc3QgY29uY2VudHJhdGVkIGludGVydmFscywgYmFzZWQgb24gYSBtZXRyaWNzIG9mIG9jY3VycmVuY2UgZGVuc2l0eSAobnVtYmVyIG9mIG9jY3VycmVuY2VzIC8gdGltZSByYW5nZSkKICAtIEFuIGFsdGVybmF0aXZlIHNhbXBsaW5nIG1ldGhvZCBjb25zaXN0aW5nIGluIGFnZ3JlZ2F0aW5nIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSB0YXhhIGZvdW5kIGluIHRoZSBzYW1lIGdlb2xvZ2ljYWwgZm9ybWF0aW9uIChvciB0aGUgc2FtZSBnZW9wbGF0ZSArIGVlYXJseSBzdHJhdGlncmFwaGljIGludGVydmFsIGlmIHRoZSBnZW9sb2dpY2FsIGZvcm1hdGlvbiBpcyBub3QgaW5kaWNhdGVkKSBzZWVtcyB0byB3b3JrIGFzIHdlbGwsIGFuZCBpcyBtb3JlIHBhbGVvbnRvbG9naWNhbGx5IHJlbGV2YW50CiAgLSBVc2luZyBjb21iaW5lZCByYW5nZXMgYnkgc3BlY2llcyBhcHBlYXJzIHRvIGJlIG1vcmUgcm9idXN0CiAgLSBWZXJ5IHJlY2VudCBzYW1wbGVzIG1heSBoYXZlIGJlZW4gZGF0ZWQgd2l0aCBhIG1vcmUgcHJlY2lzZSBtZXRob2QgYW5kIGNvbnRhaW4gbXVjaCBtb3JlIGZvc3NpbHMsIHNvIHRoZXkgc2hvdWxkIGJlIHJlbW92ZWQgb3IgdHJlYXRlZCBzZXBhcmF0YWRlbHkKCiAgICAKICAgIA==